fir*_*and 2 xml vbscript msxml
我有一个带有此条目的xml文件DataConfiguration.xml
<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>
</localdata>
</DataSource>
Run Code Online (Sandbox Code Playgroud)
我需要在"localdata"中添加另一个条目,这样就可以了
<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>
Run Code Online (Sandbox Code Playgroud)
我如何在vbscript中添加它?
我的当前代码
'created xml file object
Set xmlDoc = CreateObject("Msxml2.DOMDocument")
xmlDoc.async = False
xmlDoc.preserveWhiteSpace= True
xmlDoc.load("DataConfiguration.xml")
Dim entry
entry = "<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>"
Set NewNode = xmlDoc.createElement(entry)
Set ElemList = xmlDoc.getElementsByTagName("localdata")
ElemList.appendChild(NewNode)
Run Code Online (Sandbox Code Playgroud)
但这会给出错误
此名称在"Set NewNode = xmlDoc.createElement(entry)"中不能包含<character"
此外,ElemList.appendChild(NewNode)不起作用.
XmlDocument.CreateElement接受三个参数:节点类型,节点名称和命名空间.在您的示例中,由于您的子元素名为"add",因此它是一个元素(type == 1),它是您调用的全局xml命名空间的一部分xmlDoc.CreateElement(1, "add", "")
.
这给了你一个空元素.要插入所需的数据(Context="General"
属性和所有子元素),您需要连续调用DOM操作方法,添加每个子元素,每个属性等等.非常费力.
但是您已经将xml片段作为字符串.因此,您可以使用DOM方法创建第二个XmlDocument,并告诉它从字符串中获取其内容,而不是使用DOM方法创建元素.然后从第二个doc获取documentElement.然后在第一个doc中的相应节点上调用appendChild,从第二个doc传递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()
Run Code Online (Sandbox Code Playgroud)
...其中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
Run Code Online (Sandbox Code Playgroud)
对我来说,这个输出是:
<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>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
20449 次 |
最近记录: |