VBA 字母的 Xpath 通配符
VBA Xpath Wildcard For Letters
<?xml version="1.0"?>
<catalog>
<book id="Adventure">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<price>44.95</price>
<misc>
<Publisher id="5691">
<PublisherLocation>Los Angeles</PublisherLocation>
</Publisher>
<PublishedAuthor fName="Gambardella">
<StoreLocation>Store B</StoreLocation>
</PublishedAuthor>
</misc>
</book>
<book id="Adventure">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<price>5.95</price>
<misc>
<Publisher id="4787">
<PublisherLocation>New York</PublisherLocation>
</Publisher>
<PublishedAuthor Name="Ralls">
<StoreLocation>Store B</StoreLocation>
</PublishedAuthor>
</misc>
</book>
</catalog>
PublishedAuthor 的路径对于两本书来说是相同的,除了一个字符。是否可以为此字符设置通配符以便它接受任一 XPath?
<catalog/book/misc/PublishedAuthor[@fName=]/
产生与以下完全相同的结果:
<catalog/book/misc/PublishedAuthor[@Name=]/
如果属性名称可以是 Name
或 fName
那么您可以使用:
Sub Tester()
Dim doc As New MSXML2.DOMDocument
Dim n
doc.LoadXML Range("a1").Value
Set n = doc.SelectNodes("/catalog/book/misc/PublishedAuthor[@Name='Ralls']|" & _
"/catalog/book/misc/PublishedAuthor[@fName='Ralls']")
Debug.Print n.Length '>> 2
End Sub
属性名称没有可用的通配符。
XPath 中没有专门针对字母的通配符。您可能已经意识到,通配符适用于整个名称(元素名称或属性名称)。要在 xpath 中部分匹配,您可能需要考虑 starts-with()
和 substring()
函数。
对于这种特定情况,可能的替代方法是使用 or
运算符,这将使您免于两次编写相同的路径,就像使用 union (|
) 运算符时一样:
/catalog/book/misc/PublishedAuthor[@fName or @Name]
关于您的评论,您可以像这样使用 starts-with()
检查节点的 name()
:
/catalog/book/misc/*[starts-with(name(), 'PublishedAuthor')]/area/StoreLocation
<?xml version="1.0"?>
<catalog>
<book id="Adventure">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<price>44.95</price>
<misc>
<Publisher id="5691">
<PublisherLocation>Los Angeles</PublisherLocation>
</Publisher>
<PublishedAuthor fName="Gambardella">
<StoreLocation>Store B</StoreLocation>
</PublishedAuthor>
</misc>
</book>
<book id="Adventure">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<price>5.95</price>
<misc>
<Publisher id="4787">
<PublisherLocation>New York</PublisherLocation>
</Publisher>
<PublishedAuthor Name="Ralls">
<StoreLocation>Store B</StoreLocation>
</PublishedAuthor>
</misc>
</book>
</catalog>
PublishedAuthor 的路径对于两本书来说是相同的,除了一个字符。是否可以为此字符设置通配符以便它接受任一 XPath?
<catalog/book/misc/PublishedAuthor[@fName=]/
产生与以下完全相同的结果:
<catalog/book/misc/PublishedAuthor[@Name=]/
如果属性名称可以是 Name
或 fName
那么您可以使用:
Sub Tester()
Dim doc As New MSXML2.DOMDocument
Dim n
doc.LoadXML Range("a1").Value
Set n = doc.SelectNodes("/catalog/book/misc/PublishedAuthor[@Name='Ralls']|" & _
"/catalog/book/misc/PublishedAuthor[@fName='Ralls']")
Debug.Print n.Length '>> 2
End Sub
属性名称没有可用的通配符。
XPath 中没有专门针对字母的通配符。您可能已经意识到,通配符适用于整个名称(元素名称或属性名称)。要在 xpath 中部分匹配,您可能需要考虑 starts-with()
和 substring()
函数。
对于这种特定情况,可能的替代方法是使用 or
运算符,这将使您免于两次编写相同的路径,就像使用 union (|
) 运算符时一样:
/catalog/book/misc/PublishedAuthor[@fName or @Name]
关于您的评论,您可以像这样使用 starts-with()
检查节点的 name()
:
/catalog/book/misc/*[starts-with(name(), 'PublishedAuthor')]/area/StoreLocation