当我想使用XPath遍历我的XmlDocument时,出现了一个问题,即文档中有很多丑陋的 namespace ,因此我开始将NamespaceManager与XPath一起使用。

XML看起来像这样

<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">
    <Worksheet ss:Name="KA0100401">
        <Table>
            <Row>
                <Cell>Data</Cell>
            </Row>
            <!-- more rows... -->
        </Table>
    </Worksheet>
    <Worksheet ss:Name="KA0100402">
        <!-- .... --->
    </Worksheet>
</Workbook>

现在,从我在本文档中看到的内容来看,"urn:schemas-microsoft-com:office:spreadsheet"是默认 namespace ,因为它位于根元素上。

因此,天真地,我像这样配置了NamespaceManager:
XmlDocument document = new XmlDocument();
document.Load(reader);
XmlNamespaceManager manager = new XmlNamespaceManager(document.NameTable);
manager.AddNamespace(String.Empty, "urn:schemas-microsoft-com:office:spreadsheet");
manager.AddNamespace("o", "urn:schemas-microsoft-com:office:office");
manager.AddNamespace("x", "urn:schemas-microsoft-com:office:excel");
manager.AddNamespace("ss", "urn:schemas-microsoft-com:office:spreadsheet");
manager.AddNamespace("html", "http://www.w3.org/TR/REC-html40");

但是,当我尝试访问节点时
foreach (XmlNode row in document.SelectNodes("/Workbook/Worksheet[1]/Table/Row", manager))

我从来没有得到任何结果。我的印象是,通过将第一个 namespace 设置为空前缀,在该工作空间中搜索节点时无需设置该 namespace 。

但是,因为它是stated on the AddNamespace method:



这是为什么?而且,更重要的是:如果不使用前缀,如何访问默认 namespace 中的节点,将其设置为空 namespace ?

如果在搜索节点时甚至无法访问默认 namespace ,则在管理器上设置默认 namespace 有什么好处?

最佳答案

@JLRishe的答案对于访问默认 namespace 中的节点是正确的(即,始终将前缀映射到XmlNamespaceManager中的默认 namespace )。

从您的引号(MSDN XmlNamespaceManager.AddNamespace)中读取链接的整个上下文,即表示XPath表达式中未使用默认的“空”前缀。

10-07 19:31
查看更多