2017-03-30 3 views
0

Ich versuche, eine der untergeordneten Knoten umbenennen, in der zwei in einem übergeordneten Knoten vorhanden sind und erstellen Sie eine neue XML-Datei mit der aktualisierten information.There kann ein Elternknoten <Accounts> mit einer sein Kindknoten, aber wo es einen zweiten Kindknoten mit dem gleichen Namen gibt, möchte ich ihn in etwas wie <Account2></Account2> umbenennen. Ich habe Code, wo ich die gesamte XML-Datei lese und den Knoten umbenenne, aber ich weiß, dass dies nicht der richtige Ansatz ist.Renaming Geordnete Knoten, wo es zwei von der gleichen

Zum Beispiel XML-Daten ähnelt die folgenden:

<Accounts> 
    <Account>Value</Account> 
    <Account>Value</Account> 
</Accounts> 

VBScript:

Dim objFSO, objTextFile, strText, strNewText, objNewFile 
Dim strOriginalFile, strTempFile 

strOriginalFile = "c:\XML_File.xml" 

strTempFile = "c:\temp.xml" 

Set objFSO = CreateObject("Scripting.FileSystemObject") 

Set objNewFile = objFSO.CreateTextFile(strTempFile) 

Set objTextFile = objFSO.OpenTextFile (strOriginalFile, 1) 
strText = objTextFile.ReadAll 

strNewText = Replace(strText, "<Account>", "<Account2>", vbTextCompare) 

objNewFile.Write strNewText 

objTextFile.Close 
objNewFile.Close 
+0

Sie Code zu formatieren: blockieren Sie den Text, dann STRG + K – har07

+0

@ har07 - Danke –

Antwort

1

XPath Notation verwenden, können Sie untergeordnete Knoten Zugriff basierend off Kontext. Durchläuft jeden untergeordneten Knoten <Account> und ersetzt ihn durch einen aufgezählten Knoten, der eine tiefe Kopie des alten Knotens ist.

Set xml = CreateObject("Microsoft.XMLDOM") 

xml.async = False 
count_var = 1 

If xml.Load("C:\file.xml") Then 
    For Each accountCollection In xml.SelectNodes("//Accounts") 
     For Each account In accountCollection.SelectNodes("./Account") 
      If count_var > 1 Then 

       Set accountEnum = xml.createNode(1, "Account" & count_var, "") 
       For Each child In account.childNodes 
        accountEnum.appendChild(child.cloneNode(TRUE)) 
       Next 
       accountCollection.replaceChild accountEnum, account 

       xml.save("C:\file.xml") 
      End If 
      count_var = count_var + 1 
     Next 
     count_var = 1 
    Next 
End If 

Eingang:

<Accounts> 
    <Account>test</Account> 
    <Account> 
     <ID>000</ID> 
     <CONFIG type="binary" name="test"/> 
    </Account> 
    <Account>test1</Account> 
</Accounts> 

Ausgabe

<Accounts> 
    <Account>test</Account> 
    <Account2> 
     <ID>000</ID> 
     <CONFIG type="binary" name="test"/> 
    </Account2> 
    <Account3>test1</Account3> 
</Accounts> 
+0

Auf jeden Fall etwas, was ich kann mit arbeiten und lernen von. Leider umbenannt, es die zweite Öffnung Childs Knoten zu und Kind-Knoten schließen zu, wenn es und sein sollte. Es löschte auch alles zwischen den Kindknoten. Wirklich schätze die Mühe. –

+0

Vielleicht, um den schließenden Kindknoten zu reparieren, kann ich das Skript einfach zweimal neu starten. –

+0

Deshalb habe ich den Kommentar dort, du wirst Attribute/Text des Knotens, den du ersetzst, kopieren müssen. '' stellt einen eigenständigen Knoten dar, dem keine Attribute oder Text zugewiesen sind. –

Verwandte Themen