2016-03-01 75 views
0

我正在嘗試搜索我的XML文檔中的字符串,並且想要返回其祖先標記名稱以跟蹤它。遞歸搜索XML字符串並返回XML標記名稱

當前在我的代碼中,輸入XML路徑和字符串,並返回標記名稱echo

但我想一些修改它:

  1. 我希望用戶選擇目錄,代碼應該處理目錄下的所有XML文件。
  2. 代碼應搜索XML文件中文本的所有出現位置。
  3. 它應該以可讀格式返回信息,如字符串的表格格式,幷包含標籤名稱。

我現在的代碼在下面給出,它具有文本值和XML路徑硬編碼,它回聲每個標籤名稱。

Dim oFS  : Set oFS  = CreateObject("Scripting.FileSystemObject") 
Dim sFSpec : sFSpec  = oFS.GetAbsolutePathName("xyz.xml") 
Dim objMSXML : Set objMSXML = CreateObject("Msxml2.DOMDocument") 
objMSXML.setProperty "SelectionLanguage", "XPath" 
objMSXML.async = False 
objMSXML.load sFSpec 

If 0 = objMSXML.parseError Then 
    Dim sXPath : sXPath  = "//*[local-name()='namespace']/*[local-name()='querySubject']/*[local-name()='queryItem'][contains(., 'SearchTerm')]/ancestor-or-self::*/*[local-name()='name']" 

    '//namespace//querySubject/queryItem[contains(.,'searchTerm')]/ancestor-or-self::*/name  
    Dim querySubject : Set querySubject = objMSXML.selectSingleNode(sXPath) 
    If querySubject Is Nothing Then 
     WScript.Echo sXPath, "failed" 
    Else 
     For Each node In objMSXML.selectNodes(sXPath) 
     WScript.Echo node.text 
     Next 
    End If 
Else 
    WScript.Echo objMSXML.parseError.reason 
End If 

示例XML是:

<project xmlns = "https://afdsl/skdflsk/d"> 
    <name>Abcpos</name> 
    <property name="included" type="hidden">true</property> 
    <locales> 
    <locale>en</locale> 
    <locale>de</locale> 
    </locales> 
    <defaultLocale>en</defaultLocale> 
    <namespace> 
    <name locale="en">Abcpos</name> 
    <name locale="de">Abcpos</name> 
    <lastChanged>2015-04-06T17:37:40</lastChanged> 
    <lastChangedBy>userx</lastChangedBy> 
    <property name="included" type="hidden">true</property> 
    <namespace> 
     <name locale="en">Database Layer</name> 
     <querySubject status="valid"> 
     <name locale="en">qskxyz</name> 
     <queryItem> 
     <name locale="en">qixyz</name> 
      <hello>searchTerm</hello> 
     </queryItem> 
     </querySubject> 
    </namespace> 
    </namespace> 
    <namespace> 
    <name locale="en">Names</name> 
    <lastChanged>2016-01-12T12:42:46</lastChanged> 
    <namespace> 
     <name locale="en">Database Layer</name> 
     <querySubject status="valid"> 
     <name locale="en">qsxyz</name> 
     <queryItem> 
     <name locale="en">myName</name> 
      <hello>...Hi there..</hello> 
     </queryItem> 
     </querySubject> 
    </namespace> 
    </namespace> 
</project> 

回答

0

如果要列出包含用戶提供的文本在XML中的任何地方的所有節點的父節點的名稱,你可以簡單地使用這樣的事情:

xpath = "//*[contains(.,'" & searchtext & "')]/.." 
For Each node In objMSXML.SelectNodes(xpath) 
    WScript.Echo node.NodeName 
Next 

至於處理一個目錄中的所有XML文件,這裏有很多關於SO和其他地方的例子。