2017-03-06 55 views
0

我想遍歷XML文件中的所有元素,並通過文本文件將值分配給元素。循環遍歷所有XML元素並根據文本文件的輸入添加XML文件

project_template.xml

<project baseDir="" outputDir=""> 
    <rule inherit="" preset="" pattern="" /> 
</project> 

test.txt

baseDir="test1" 
outputDir="test2" 
inherit="test3" 
preset="test4" 
pattern="true"

Project.vbs

Option Explicit 
Dim arrFileLines(), final(45) 
Dim i, objFSO, objFile, l, index, finalString 
i = 0 

Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objFile = objFSO.OpenTextFile("C:\Users\1021752\Desktop\project\test.txt", 1) 
Do Until objFile.AtEndOfStream 
    ReDim Preserve arrFileLines(i) 
    arrFileLines(i) = objFile.ReadLine 
    i = i + 1 
Loop 
objFile.Close 

Const NODE_ELEMENT = 1 
Const CONFUSER_NS = "http://confuser.codeplex.com" 

Dim doc, moduleElem, args, arg 

Set args = WScript.Arguments 
Set doc = CreateObject("Msxml2.DOMDocument") 

doc.Async = False 
doc.Load "project_template.xml" 

If doc.ParseError.ErrorCode Then 
    WScript.Echo doc.ParseError 
    WScript.Quit 1 
End If 

For l = LBound(arrFileLines) To UBound(arrFileLines) Step 1 
    index = InStr(1, arrFileLines(l), "=") 
    final(l) = Right(arrFileLines(l), Len(arrFileLines(l)) - index) 
Next 
doc.DocumentElement.SetAttribute "baseDir", final(0) 'here I am manually assigning the value to the "baseDir" 
doc.DocumentElement.SetAttribute "outputDir", final(1) 
doc.DocumentElement.SetAttribute "inherit", final(2) 
doc.DocumentElement.SetAttribute "preset", final(3) 
doc.DocumentElement.SetAttribute "pattern", final(4) 
doc.Save "project.xml" 

希望的輸出:

<project baseDir="test1" outputDir="test2" > 
    <rule inherit="test3" preset="test4" pattern="true" /> 
</project> 

我希望代碼遍歷XML文件中的所有元素並返回名稱。

回答

0

我會推薦閱讀您的參數文件轉換爲dictionary

Set fso = CreateObject("Scripting.FileSystemObject") 

Set d = CreateObject("Scripting.Dictionary") 
Set f = fso.OpenTextFile("C:\Users\1021752\Desktop\project\test.txt") 
Do Until f.AtEndOfStream 
    arr = Split(f.ReadLine, "=", 2) 
    d(arr(0)) = Replace(arr(1), """", "") 
Loop 
f.Close 

而且,您的代碼將所有屬性添加到XML數據,而不是更新每個單獨節點的屬性的根節點。你需要的是一個更新出現在當前節點的屬性遞歸過程,然後做同樣的對所有的子節點:

Sub UpdateAttributes(node, values) 
    For Each attr In node.Attributes 
    If values.Exists(attr.Name) Then node.SetAttribute attr.Name, values(attr.Name) 
    Next 

    For Each child In node.ChildNodes 
    UpdateAttributes child, values 
    Next 
End Sub 

調用程序與XML根節點,你的字典裏:

UpdateAttributes doc.DocumentElement, d 
+0

我改變了代碼比特,我刪除If語句'子UpdateAttributes(節點,值) 對於每個ATTR在node.Attributes node.SetAttribute ATTR,值(ATTR) 接着 爲每個子在節點.ChildNodes 更新eAttributes child,值 Next End Sub'當我實現這個方法並運行它時,它拋出了一個類型不匹配錯誤800A000D。你能幫我解決它,因爲我沒有找到任何解決方案 –

+0

你需要使用'attr.Name',而不是'attr'。查看更新的答案。 –