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=]/

如果属性名称可以是 NamefName 那么您可以使用:

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