8

我有一个 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>

这是可能的示例代码:

    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);
    }

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

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

如果这是重复的,我深表歉意。

4

3 回答 3

14

要继续使用 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);
}
于 2013-11-08T19:07:20.010 回答
2

但它使用 Descendants() 方法来查询 XML。据我了解,如果我正在搜索此解决方案将失败,因为存在相同的标签,并且

我很确定你不太了解它是如何工作的。从MSDN 文档

按文档顺序返回此文档或元素的后代元素的过滤集合。只有具有匹配 XName 的元素才会包含在集合中。

所以在你的情况下,只需这样做:

xDoc.RootNode
    .Descendants("E5")
    .Where(n => n.Parent.Name.LocalName == "B4");
于 2013-11-08T19:01:25.990 回答
0

尝试这个

var xDoc = XDocument.Parse("<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>");
        foreach (XElement item in xDoc.Element("A1").Elements("B2").Elements("C3").Elements("D4"))
        {
            Console.WriteLine(item.Element("E5").Value);//to get the value of E5
            Console.WriteLine(item.Element("E5").Attribute("id").Value);//to get the value of attribute
        }
于 2013-11-08T19:17:46.167 回答