2015-05-18 3 views
2

В данный момент я создаю XML, как это - и он прекрасно работает ...Каков оптимальный способ создания XML с использованием MSXML

Private Function CreateDom() 
    Dim dom 
    Set dom = New DOMDocument 
    dom.async = False 
    dom.validateOnParse = False 
    dom.resolveExternals = False 
    dom.preserveWhiteSpace = True 
    Set CreateDom = dom 
End Function 

Public Function generateXML(sourceFileLocation) 

'I make an instance of the dom 

Set dom = CreateDom 

'This is how I setup a root node 

Set rootXML= dom.createElement("root") 
    dom.appendChild rootXML 

'This is how I set attributes 
questestinterop.setAttribute "attributeName", "attributeValue" 

'setup a child node 
Set childOfRoot = dom.createElement("childOfRoot") 
rootXML.appendChild childOfRoot 

'This is how I set the text of the element 

childOfRoot.Text = "Text Value" 
End Function 

Это нормально в моем простом примере выше, но позволяет сказать, что я имеют большее количество XML для создания - я получаю LOADS из appendchilds и много объектов - эти швы неэффективны и подвержены ошибкам, - но имеет то преимущество, что я могу добавить объект к ранее созданному в любой момент.

С MSXML У меня нет InnerXML для меня, поэтому код является подробным. Я после более эффективного способа создания XML с использованием MSXML и VBA/VB - или лучшей практики для такого рода работ - я не могу не чувствовать, что есть лучший способ.

UPDATE я упоминал выше, не было InnerXml - но есть способ, чтобы загрузить XML-фрагмент в DOM

Sub MergeXML() 

    'Define 
    Dim oXml As New MSXML2.DOMDocument 
    Dim oXml2 As New MSXML2.DOMDocument 

    'Assign 
    oXml.loadXML ("<SomeRootElement><Input></Input></SomeRootElement>") 
    oXml2.loadXML ("<Output><SomeElement></SomeElement></Output>") 
    'or assign via file 
    'oXml.Load("c:\Xml.xml") 
    'oXml2.Load("c:\Xml2.xml") 

    'Process 
    oXml.FirstChild.appendChild oXml2.selectSingleNode("//Output") 

    'Destroy 
    oXml.Save ("c:\NewXml.xml") 
    Set oXml2 = Nothing 
    Set oXml = Nothing 

End Sub 

Источник: http://p2p.wrox.com/beginning-vb-6/28319-xml-using-msxml2-domdocument-object.html

+0

Это код из VBA, но все равно будет работать в VB.net. Методы MSXML остаются теми же. – Rob

+1

используйте сериализуемые классы, например следующую веб-страницу: http://stackoverflow.com/questions/30274147/update-multi-table-dataset-via-datagridvie w-vb # comment48680953_30274147 – jdweng

+1

Действительно ли 'Set' остается в VB.Сеть? Кроме того, добавьте 'Option Strict On' в начало вашего файла кода или установите его в свойствах вашего проекта. –

ответ

2

XML часто является представление объект, хранящийся в файле. .Net имеет много популярных пакетов, которые упрощают сериализацию и десериализацию, позволяя вам генерировать xml из объекта и объекта из xml.

VBA не имеет возможности использовать этот хороший пакет, но я использовал модуль, который по сути делает то же самое. http://www.kudinov.ru/?p=21

Это позволяет сосредоточиться на построении своего класса и управлении вашими данными. Модуль позаботится о создании XML для вас.

UPDATE:

Сначала создайте ваш родительский класс

VERSION 1.0 CLASS 
BEGIN 
    MultiUse = -1 'True 
END 
Attribute VB_Name = "ParentClassContainer" 
Attribute VB_GlobalNameSpace = False 
Attribute VB_Creatable = False 
Attribute VB_PredeclaredId = False 
Attribute VB_Exposed = False 

Option Explicit 
Public Persons() As ChildClassWithEveryXmlAttributes 

Во-вторых создать свой дочерний класс

VERSION 1.0 CLASS 
BEGIN 
    MultiUse = -1 'True 
END 
Attribute VB_Name = "ChildClassWithEveryXmlAttributes" 
Attribute VB_GlobalNameSpace = False 
Attribute VB_Creatable = False 
Attribute VB_PredeclaredId = False 
Attribute VB_Exposed = False 

Option Explicit 
Public FirstName As String 
Public LastName as String 
Public Birdthday as date 

В-третьих, не забудьте включить модуль сериализации

Наконец , вы можете использовать свой объекты и сериализовать его в конце

Sub testSerialize() 
    Dim myObject As New ParentClassContainer 
    Redim myObject.Persons(20) 
    myObject.Persons(0).FirstName = "John" 
    myObject.Persons(0).LastName = "Doe" 
    myObject.Persons(0).Birdthday = #2015-05-21# 

    Serialize myObject, "C:\test.xml", False 
End Sub 

Таким образом, мы создали файл XML никогда не играл с функциями createElement и AppendChild от MSXML. Это меньше подвержено ошибкам, потому что вы играете с объектами.

XML Выходной результат

<?xml version="1.0"?> 
<Object class="ParentClassContainer"> 
    <PropertyGet name="Persons" type="VT_EMPTY"> 
     <Object class="ChildClassWithEveryXml"> 
      <PropertyGet name="FirstName" type="VT_BSTR"> 
       <![CDATA[John]]> 
      </PropertyGet> 
      <PropertyPut name="FirstName" type="VT_BSTR"/> 
      <PropertyGet name="LastName" type="VT_BSTR"> 
       <![CDATA[Doe]]> 
      </PropertyGet> 
      <PropertyPut name="LastName" type="VT_BSTR"/> 
      <PropertyGet name="Birdthday" type="VT_DATE"> 
       <![CDATA[2015-05-21]]> 
      </PropertyGet> 
      <PropertyPut name="Birdthday" type="VT_DATE"/> 
     </Object> 
    </PropertyGet> 
    <PropertyPut name="Persons" type="VT_VARIANT"/> 
    <PropertyPutRef name="Persons" type="VT_EMPTY"/> 
</Object> 

Я создал файл первенствовать для этого, я не знаю, как загрузить его здесь или, если это возможно ...

Sample excel file with Vba as requested

+0

Это интригует - можете ли вы привести пример того, как метод отличается от того, что он делает в моем примере? это меньше кода – Rob

+0

, это лучше, чем было, но его до сих пор неясно, как это создает XML или как работают дочерние отношения родителей. Можете ли вы улучшить свой ответ, показывая полученный XML в своем примере? – Rob

+0

В чистой сериализации VBA невозможно. Кроме того, регистрация COM-серверов для пользователей немного зависит от решений Excel-VBA, поскольку одним из главных прелестей инструментов Excel является то, что у них нет накладных расходов на развертывание. Как и в этом примере, сериализация выполняется через некоторую оболочку, возможно, оболочку C#, поэтому потребуется развертывание. – cyboashu

Смежные вопросы