2010-12-01 68 views
2

我有一个XML文件DataConfiguration.xml与此项子条目添加到XML文件中的特定节点vbscipt

<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> 

我需要添加另一个项目为“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> 

我该如何在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) 

但是,这给了错误

这个名字可能不包含<字符 “在” 设置NewNode = xmlDoc.createElement(项)

ElemList.appendChild(NewNode)也不起作用。

回答

6

XmlDocument.CreateElement接受三个参数:节点类型,节点名称和名称空间。 在你的例子中,由于你的子元素被命名为“add”,它是一个元素(类型== 1),并且它是全局xml名称空间的一部分,所以你可以调用xmlDoc.CreateElement(1, "add", "")

这给你一个空的元素。要插入你想要的数据(Context="General"属性和所有子元素),你需要连续调用DOM操作方法,添加每个子元素,每个属性等等。相当费劲。

但是你已经有了xml片段作为字符串。因此,不是使用DOM方法创建元素,而是可以创建第二个XmlDocument并告诉它从字符串中获取其内容。然后从第二个文档中抓取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() 

...其中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> 
+0

感谢我调试了这段代码,GetElementFromXmlString甚至没有任何有效的xmlString。 – fireBand 2010-12-02 15:12:17