即使存在命名空间也能工作的表达式

本文关键字:工作 表达式 存在 命名空间 | 更新日期: 2023-09-27 18:27:46

我希望能够根据以下XML评估正常XPath表达式,该XML具有我不关心的讨厌的xmlns属性:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="AuthorIT.xslt"?>
<AuthorIT version="6.0.8" xmlns="http://www.authorit.com/xml/authorit" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.authorit.com/xml/authorit AuthorIT.xsd">
    <Objects>
        <Book>
            <Object>
                <CreatedBy>Me</CreatedBy>
                <CreatedDate>2012-11-20T12:35:33</CreatedDate>
                <Description>String I want to get</Description>
                <FolderID>12345</FolderID>
                <GUID>abcdefg1234567abcdefg1234567abcd</GUID>
                <ID>99999</ID>
            </Object>
        </Book>
    </Objects>
</AuthorIT>

在XMLSpy(或这个免费的web工具)中,"String I want to get"的表达式如下:

/AuthorIT/Objects/Book/Object/Description

这就是我在c#:中指定命名空间的方式

XPathDocument document = new XPathDocument("/path/to/my/file");
XPathNavigator navigator = document.CreateNavigator();
XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable);
manager.AddNamespace("abc", "http://www.authorit.com/xml/authorit");

一旦我指定了名称空间,以下是我必须修改非常好的XPath表达式以获得相同结果的方法:

/abc:AuthorIT/abc:Objects/abc:Book/abc:Object/abc:Description

太可怕了,不是吗?!有没有一种方法可以评估绕过并完全忽略AuthorIT根元素上这个极其讨厌的"xmlns"属性的XPath表达式?如果我完全去掉根元素,使其单独存在,则不需要指定名称空间,并且可以使用普通表达式。有没有一种方法可以告诉.NET像"xmlns"垃圾一样工作?

即使存在命名空间也能工作的表达式

是的,有一种方法可以使用/local-name()='AuthorIT'/local-name()='Objects'/local-name()='Book'/local-name()='Object'/local-name()='Description'