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 をクエリします。私の理解では、<D7>、<D4 id="1">、および <D4 id="2"> に同じタグが存在するため、<E5> を検索していた場合、このソリューションは失敗します。

私の要件は、ノードが特定の XPath に存在するかどうかを検索することです。子孫を使用してこれを行う方法があれば、喜んで使用します。そうでない場合は、名前空間を使用して検索する方法を教えてください。

これが重複している場合はお詫び申し上げます。

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 に答える