c# - 如何选择使用默认命名空间的节点?

标签 c# xml xpath xsd xml-namespaces

XML 文件的结构大致如下:

<?xml version="1.0" encoding="UTF-8"?>
<a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="url1" xsi:schemaLocation="url2 url3">
   <b>
     <c></c>
     <c></c>
     <c></c>
   </b>
</a>

我的目标是选择所有“c”元素,但以下 xpath 表达式不起作用:“//a/b/c”。

即:

XmlDocument doc= new XmlDocument();
doc.Load(filepath);
XmlNodeList l = doc.SelectNodes("//a/b/c"); // 0 nodes

我测试过的唯一有效的 xpath 表达式是/*(1 个节点)和//*(所有节点)。

这个问题与 XML 命名空间有关吗?如果是这样,设置 XMLDocument 对象的正确方法是什么?

        XmlDocument doc= new XmlDocument();
        doc.Load(filepath);
        XmlNamespaceManager m = new XmlNamespaceManager(doc.NameTable);
        m.AddNamespace(/* what goes here? */);
        XmlNodeList l = doc.SelectNodes("//a/b/c", m);

最佳答案

您需要为文档使用的默认命名空间分配一个命名空间前缀,然后在您的 XPath 中使用它:

XmlDocument doc= new XmlDocument();
doc.Load(filepath);

XmlNamespaceManager m = new XmlNamespaceManager(doc.NameTable);
m.AddNamespace("myns", "url1");

XmlNodeList l = doc.SelectNodes("/myns:a/myns:b/myns:c", m);

您基本上可以用任何东西(不带空格的字母数字)替换前缀“myns”,只要它在第 4 行和 XPath 之间保持一致,并且在第 4 行中正确分配给“url1”命名空间即可。

关于c# - 如何选择使用默认命名空间的节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14370989/

相关文章:

java - 使用java和Xpath获取xml的所有属性

java - Java 中的 XML,如何在 XML 中将 @XmlElement 属性 Java Bean Null 显示为空值(已找到解决方案)

c# - Selenium C# - 它从错误的表中选择一个单元格

c# - 用户首次使用 OpenId Connect 登录后,将新 UserId 放入数据库的位置在哪里?

c# - UIProgressView 未从 BackgroundWorker.ProgressChanged 更新

c# - 在 C# 中为多线程锁定 DataTable 的正确方法?

sql-server - 操作 XML 命名空间

c# - 如何告诉 [Authorize] 属性将基本身份验证与自定义消息处理程序一起使用?

xml - 如何使用 XSLT 进行通配符匹配?

xml - 使用 XPath 进行挑选