2010-12-01 71 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