递归搜索XML字符串并返回XML标记名称
问题描述:
我正在尝试搜索我的XML文档中的字符串,并且想要返回其祖先标记名称以跟踪它。递归搜索XML字符串并返回XML标记名称
当前在我的代码中,输入XML路径和字符串,并返回标记名称echo
。
但我想一些修改它:
- 我希望用户选择目录,代码应该处理目录下的所有XML文件。
- 代码应搜索XML文件中文本的所有出现位置。
- 它应该以可读格式返回信息,如字符串的表格格式,并包含标签名称。
我现在的代码在下面给出,它具有文本值和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>
答
如果要列出包含用户提供的文本在XML中的任何地方的所有节点的父节点的名称,你可以简单地使用这样的事情:
xpath = "//*[contains(.,'" & searchtext & "')]/.."
For Each node In objMSXML.SelectNodes(xpath)
WScript.Echo node.NodeName
Next
至于处理一个目录中的所有XML文件,这里有很多关于SO和其他地方的例子。