VBA Xpath字母通配符

时间:2015-04-15 20:23:57

标签: vba dom xpath xml-parsing

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

2 个答案:

答案 0 :(得分:1)

如果属性名称可以是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

属性名称没有可用的通配符。

答案 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