<?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=]/
答案 0 :(得分:1)
如果属性名称可以是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
属性名称没有可用的通配符。
答案 1 :(得分:1)
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