通过XPathSelectElements获取带有命名空间的XElement

Cha*_*lie 6 c# xml xpath linq-to-xml

我有一个XML例如

    <?xml version="1.0" encoding="utf-8"?>
    <A1>
       <B2>
          <C3 id="1">
             <D7>
                <E5 id="abc" />
             </D7>
             <D4 id="1">
                <E5 id="abc" />
             </D4>
             <D4 id="2">
                <E5 id="abc" />
             </D4>
          </C3>
       </B2>
    </A1>
Run Code Online (Sandbox Code Playgroud)

这可能是示例代码:

    var xDoc = XDocument.Load("Test.xml");
    string xPath = "//B2/C3/D4";
    //or string xPath = "//B2/C3/D4[@id='1']";

    var eleList = xDoc.XPathSelectElements(xPath).ToList();
    foreach (var xElement in eleList)
    {
        Console.WriteLine(xElement);
    }
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但是如果我向根节点A1添加命名空间,则此代码不起作用.在搜索解决方案时,我找到了这个解决方案,但它使用Descendants()方法来查询XML.根据我的理解,如果我搜索<E5>,此解决方案将失败,因为<D7>,<D4 id ="1">和<D4 id ="2">存在相同的标记>

我的要求是搜索某个节点是否存在于特定的XPath中.如果有一种使用后代的方法,我会很高兴使用它.如果没有,请指导我如何使用名称空间进行搜索.

如果这是重复,我道歉.

Rub*_*ias 11

要继续使用XPath,您可以使用以下链接:

var xDoc = XDocument.Parse(@"<?xml version='1.0' encoding='utf-8'?>
    <A1 xmlns='urn:sample'>
        <B2>
            <C3 id='1'>
                <D7><E5 id='abc' /></D7>
                <D4 id='1'><E5 id='abc' /></D4>
                <D4 id='2'><E5 id='abc' /></D4>
            </C3>
        </B2>
    </A1>");

// Notice this
XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable());
nsmgr.AddNamespace("sample", "urn:sample");

string xPath = "//sample:B2/sample:C3/sample:D4";

var eleList = xDoc.XPathSelectElements(xPath, nsmgr).ToList();
foreach (var xElement in eleList)
{
    Console.WriteLine(xElement);
}
Run Code Online (Sandbox Code Playgroud)

  • 命名空间**前缀**并不重要,只是**值**部分;因此,如果您将前缀从“sample”重命名为“whatever”,那就没问题了。 (2认同)
  • @Charlie,如果您的 XML 文档有名称空间而您的 XPath 表达式没有,则需要更改其中之一。 (2认同)