2010-12-01 11 views
2

Ich habe eine XML-Datei DataConfiguration.xml mit diesem Eintraghinzufügen Kind-Eintrag zu einem bestimmten Knoten in XML-Datei in 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> 

Ich brauche einen weiteren Eintrag hinzufügen zu „localdata“ so wäre es

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

Wie würde ich das in Vbscript hinzufügen?

Mein Aktueller Code

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

Aber dies dem Fehler geben

Dieser Name nicht < Zeichen "auf" Set NewNode = xmlDoc.createElement (Eintrag) enthält

Auch das ElemList.appendChild (NewNode) funktioniert nicht.

Antwort

6

XmlDocument.CreateElement akzeptiert drei Parameter: einen Knotentyp, einen Knotennamen und einen Namespace. Da in Ihrem Beispiel Ihr untergeordnetes Element den Namen "add" hat, ist es ein Element (type == 1) und Teil des globalen XML-Namespaces. Sie würden xmlDoc.CreateElement(1, "add", "") aufrufen.

Das gibt Ihnen ein leeres Element. Um die gewünschten Daten einzufügen (das Attribut Context="General" und alle untergeordneten Elemente), müssen Sie nacheinander die DOM-Bearbeitungsmethoden aufrufen, um jedes untergeordnete Element, jedes Attribut usw. hinzuzufügen. Ziemlich mühsam.

Aber Sie haben bereits das XML-Fragment als Zeichenfolge. Anstatt also das Element mithilfe von DOM-Methoden zu erstellen, können Sie ein zweites XmlDocument erstellen und es anweisen, seinen Inhalt aus der Zeichenfolge abzurufen. Dann nimm das documentElement von diesem zweiten Dokument. Rufen Sie dann appendChild auf dem entsprechenden Knoten im ersten Dokument auf und übergeben Sie das Dokumentelement aus dem zweiten Dokument.

etwas wie folgt aus:

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

... wo die PrettyPrintXml Funktion wie folgt definiert ist:

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 

Der Ausgang dieses, für mich ist:

<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

Danke, ich habe diesen Code debugged und GetElementFromXmlString ist nichts für einen gültigen XMLString. – fireBand

+0

Sorry, mein Fehler, ich hatte den zweiten Parameter so . – fireBand

+0

Es muss Platz zwischen Attributen sein. – fireBand