2013-02-20 50 views
2

我想使用遞歸技術來檢索xml文件。有人可以幫助我做到這一點。使用vbscript遞歸XML文件

我想閱讀下面的XML,但不知道嵌套標籤的深度,所以我想使用遞歸技術。

<TestSuites> 
    <TestSuite SuiteName="Regression"> 
    <TestCase TCName="TestCase 1"> 
     <TestStep TSName="TestStep 1"/> 
     <TestStep TSName="TestStep 2"/> 
    </TestCase> 
    <TestCase TCName="TestCase 2"> 
     <TestStep TSName="TestStep 1"/> 
     <TestStep TSName="TestStep 2"/> 
    </TestCase> 
    </TestSuite> 
    <TestSuite SuiteName="Smoke"/> 
    <TestSuite SuiteName="Sanity"/> 
</TestSuites> 
+3

相反:你想達到什麼目的?你必須提供更多的細節,才能讓任何人都能夠進行半途而廢的猜測。 – 2013-02-20 11:20:20

+0

我想閱讀下面的XML,但不知道深度的嵌套標籤,所以我想使用遞歸技術 user1934035 2013-02-20 15:45:13

+3

我冒昧地用您評論中的文字更新您的問題。請避免在評論中張貼代碼片段,因爲它們往往難以閱讀。 – 2013-02-20 17:58:02

回答

1

VBScript爲您提供tools解析和處理XML結構:

Set nodes = xml.selectnodes("//TestStep[@TSName='TestStep 2']") 

Set xml = CreateObject("MSXML2.DOMDocument") 
xml.async = False 
xml.load "c:\path\to\foo.xml" 
WScript.Echo xml.xml 

您可以在文檔樹使用(除其他事項外)的XPath查詢語言訪問元素

以上選擇樹中任意位置的所有TestStep節點,它們的屬性爲TSName,其值爲TestStep 2

一旦你的節點(一個或多個),您可以讀取或更改其屬性:

WScript.Echo nodes.Length 
WScript.Echo nodes(0).parentNode.nodeName 
WScript.Echo nodes(1).parentNode.nodeName 

WScript.Echo nodes(0).text 
nodes(0).text = "foo" 
WScript.Echo nodes(0).text 
WScript.Echo xml.xml 
+0

@ Ekkehard.Horner「通過價值」,實際上。 ;)那些不知道我們在說什麼的人:請允許我將你引薦到[Eric Lippert的博客文章](http://blogs.msdn.com/b/ericlippert/archive/2003/09/15/ 52996.aspx)關於這個問題。 – 2013-02-20 19:07:52

+0

對不起,我刪除了評論(要求刪除.load語句中的參數列表())@Ansgar反駁。 – 2013-02-20 19:14:48

1

你需要一個遞歸子來遍歷XML文檔樹。原則:

Dim oFS : Set oFS = CreateObject("Scripting.FileSystemObject") 
    Dim sFSpec : sFSpec = oFS.GetAbsolutePathName("..\data\so14975608.xml") 
    Dim oXML : Set oXML = CreateObject("Msxml2.DOMDocument.6.0") 
    oXML.load sFSpec 
    If 0 = oXML.parseError Then 
    recursiveTraversal oXML.documentElement, 0 
    Else 
    WScript.Echo objMSXML.parseError.reason 
    End If 

Sub recursiveTraversal(oElm, nIndent) 
    WScript.Echo Space(nIndent), oElm.tagName 
    If 0 < oElm.childNodes.length Then 
    Dim oChild 
    For Each oChild In oElm.childNodes 
     recursiveTraversal oChild, nIndent + 2 
    Next 
    Else 
    If 0 < oElm.attributes.length Then 
     Dim oAttr 
     For Each oAttr In oElm.attributes 
      WScript.Echo Space(nIndent + 1), oAttr.name, oAttr.value 
     Next 
    End If 
    End If 
End Sub 

輸出爲您的樣品數據:

TestSuites 
    TestSuite 
    TestCase 
     TestStep 
     TSName TestStep 1 
     TestStep 
     TSName TestStep 2 
    TestCase 
     TestStep 
     TSName TestStep 1 
     TestStep 
     TSName TestStep 2 
    TestSuite 
    SuiteName Smoke 
    TestSuite 
    SuiteName Sanity 

基於一個更詳細的計劃 - 你需要提取/處理什麼樣的信息 - 你必須要學習一些合適的XML文檔(start here)確定放入上述骨架中的函數/屬性。

P.S:

的人誰不買上面會不會從this獲利。