2013-11-20 12 views
0

我有一個xml文件,看起來像這樣;如何從由它的屬性指定的元素中獲取childnode.element.text?

[data.xml中]

<?xml version="1.0"?> 
    <elem1 id="obj1"> 
     <celem1>Text1</celem1><celem2>Text2</celem2> 
    </elem1> 
    <elem2 id="obj2"> 
     <celem1>Text3</celem1><celem2>Text4</celem2> 
    </elem2> 

這看起來像這樣的讀取XML功能;

Function GetVar(XMLTag, strNum) 
    Set oXMLFile = CreateObject("Msxml2.DOMDocument") 
     oXMLFile.Load("data.xml") 
    Set oXMLFileVariable = oXMLFile.getElementsByTagName(XMLTag) 
     GetVar = oXMLFileVariable.Item(strNum).Text 
End Function 

調用這樣的功能;

Call GetVar("celem1", 0) 
    Call GetVar("celem2", 0) 
    Call GetVar("celem1", 1) 
    Call GetVar("celem2", 1) 

將返回;

「文本1」
「文本2」
「文本3」
「文本4」

我希望能夠返回的childnode element.text通過指定其父節點的屬性。像這樣的東西;

[僞碼 - 請原諒我,如果我的方式在這裏下車]

GetChildNode.Text(elem1(GetAttribute="obj1").celem1()) 

會回到這樣的事情;

「文本1」

我之所以這樣問是因爲我想有利於那些普通的刪除特定元素的名稱,然後就可以通過指定召喚出特定element.text信息屬性。我不喜歡爲xml文檔中的每個新條目創建和維護一個唯一的元素標記。

我目前正在使用VBscript,但我可以改變到別的東西(Windows環境),將工作。

[--- --- EDIT]

使用安斯加爾Wiechers實例中,我已經創建了以下;

[data。XML]

<?xml version="1.0"?> 
    <elem id="obj1"> 
     <celem id="item1">Text1</celem><celem id="item2">Text2</celem> 
    </elem> 
    <elem id="obj2"> 
     <celem id="item1">Text3</celem><celem id="item2">Text4</celem> 
    </elem> 

和腳本;

str1 = GetVar("obj1", "celem", "item1") 
str2 = GetVar("obj2", "celem", "item2") 
MsgBox str1 
MsgBox str2 

Function GetVar(parentID, childNode, childAtt) 
    GetVar = Null 'set a safe default return value 

    Set oXMLFile = CreateObject("Msxml2.DOMDocument.6.0") 
    oXMLFile.async = False 
    oXMLFile.Load "xpath.xml" 

    If oXMLFile.parseError = 0 Then 
      xpath = "//*[@id='" & parentID & "']/" & childNode _ 
       & "[@id='" & childAtt & "']" 
      Set node = oXMLFile.selectSingleNode(xpath) 
      If Not node Is Nothing Then GetVar = node.text 
    Else 
      'report errors 
      WScript.Echo oXMLFile.parseError.reason 
    End If 
End Function 


第一MSGBOX將返回 「文本1」
第二MSGBOX將返回 「文本4」

這正是我一直在尋找! !

+0

做一些閱讀它似乎可能工作; oXMLFile.getElementsByTagName(「elem1」)[0] .childNodes(「celem1」)[0] 我得試試看。 – s3d83d

回答

0

使用XPath expression用於選擇節點(一個或多個):

Function GetVar(parentId, childNode) 
    GetVar = Null 'set a safe default return value 

    Set oXMLFile = CreateObject("Msxml2.DOMDocument.6.0") 
    oXMLFile.async = False 
    oXMLFile.load "data.xml" 

    'Without having set async to False the above instruction would load the 
    'file in the background, so your code would try to process data that 
    'isn't completely loaded yet. 

    If oXMLFile.parseError = 0 Then 
    xpath = "//*[@id='" & parentId & "']/" & childNode 
    Set node = oXMLFile.selectSingleNode(xpath) 
    If Not node Is Nothing Then GetVar = node.text 
    Else 
    'report errors 
    WScript.Echo oXMLFile.parseError.reason 
    End If 
End Function 

XPath表達式//*[@id='obj1']/celem1意味着:選擇具有與屬性id用一個值obj1父節點的任何節點<celem1>。通過使用selectSingleNode方法,您只選擇此類節點的第一次出現(如果有的話)。

如果可以有多個匹配的節點,並且您不想只返回第一個匹配的節點的值,則需要定義如何處理其他節點的值。

+0

謝謝。這很好。儘管我有兩個問題, 示例1: 在我上面的示例中;我有兩個子節點「celem1」和「celem2」。現在讓我們將這兩個子節點重命名爲'celem'。我將如何獲得第二個'celem'的回報。示例2:在我上面的示例中;我有兩個子節點「celem1」和「celem2」。現在讓我們將這兩個子節點重命名爲'celem'。第一個'celem'將有一個屬性id =「item1」,第二個'celem'將有一個屬性id =「item2」。我將如何更改您的示例以適應對parentnode.attribute/childnode.attribute的調用? – s3d83d

+0

對於第一個示例,您將使用'selectNodes'而不是'selectSingleNode',並通過'.item(1)'訪問所得集合的第二個元素。對於第二個示例,您只需將一個屬性選擇器添加到子節點('.../celem [@ id ='item2']')。 –

+0

不錯!例子二完美無缺。我會用上面的建議發佈另一個答案。謝謝soooo多!我會upvote你,但我還沒有足夠的代表呢。當我擁有足夠的時間時,我會迴圈。 – s3d83d