XmlDocument.CreateElement принимает три параметра: тип узла, имя узла и пространство имен.
В вашем примере, поскольку ваш дочерний элемент называется «add», это элемент (type == 1), и он является частью глобального пространства имен xml, вы бы назвали xmlDoc.CreateElement(1, "add", "")
.
Это дает вам пустой элемент. Чтобы вставить нужные данные (атрибут Context="General"
и все дочерние элементы), вам нужно будет последовательно выполнять вызовы методов манипуляции DOM, добавлять каждый дочерний элемент, каждый атрибут и т. Д. Довольно трудоемко.
Но у вас уже есть фрагмент xml в виде строки. Таким образом, вместо создания элемента с использованием методов DOM, вы можете создать второй XmlDocument и указать ему получать его содержимое из строки. Затем возьмите documentElement из этого 2-го документа. Затем вызовите appendChild соответствующего узла в первом документе, передавая documentElement из второго документа.
как то так:
Function GetElementFromXmlString(xmlString)
Dim doc
set doc = CreateObject("Msxml2.DOMDocument.6.0")
doc.async = False
doc.preserveWhiteSpace= False
doc.loadXML(xmlString)
Set GetElementFromXmlString = doc.documentElement
End Function
Sub Main()
Set doc1 = CreateObject("Msxml2.DOMDocument.6.0")
doc1.async = False
doc1.preserveWhiteSpace= False ' True
doc1.load("DataConfiguration.xml")
' generate an Element from an XML string
Dim xmlString
xmlString = "<add context=""General"">" & _
" <parameter name=""timeout"" type=""int"" defaultvalue=""60""/>" & _
" <parameter name=""address"" type=""string"" defaultvalue=""192.168.9.478"" />" & _
" <parameter name=""port"" type=""int"" defaultvalue=""5674""/>"& _
"</add>"
Dim newElt
Set newElt = GetElementFromXmlString(xmlString)
' get the first child node of type=Element under the document root element in
' doc1. This is not the same as doc1.documentElement.firstChild. There can
' be text nodes, etc.
Dim node1
Set node1 = doc1.documentElement.selectSingleNode("./*[position()=1]")
' append the element to the node
node1.appendChild(newElt)
WScript.echo (PrettyPrintXml (doc1))
End Sub
Main()
... где функция PrettyPrintXml определяется следующим образом:
Function PrettyPrintXml(xmldoc)
Dim reader
set reader = CreateObject("Msxml2.SAXXMLReader.6.0")
Dim writer
set writer = CreateObject("Msxml2.MXXMLWriter.6.0")
writer.indent = True
writer.omitXMLDeclaration = True
reader.contentHandler = writer
reader.putProperty "http://xml.org/sax/properties/lexical-handler", writer
reader.parse(xmldoc)
PrettyPrintXml = writer.output
End Function
Вывод этого для меня:
<DataSource>
<localdata>
<add context="Localization">
<parameter name="timeout" type="int" defaultvalue="60"/>
<parameter name="address" type="string" defaultvalue="192.168.9.45"/>
<parameter name="port" type="int" defaultvalue="6789"/>
</add>
<add context="General">
<parameter name="timeout" type="int" defaultvalue="60"/>
<parameter name="address" type="string" defaultvalue="192.168.9.478"/>
<parameter name="port" type="int" defaultvalue="5674"/>
</add>
</localdata>
</DataSource>