3

ボンジュール、

私はxmlドキュメントを持っています:

<ns2:feeds xmlns:ns2="XXXX" xmlns="XXXXX" version="3.0">
    <ns2:feed>
        <name>XXX</name>
    </ns2:feed>
    <ns2:feed>
        <name>XXX</name>
    </ns2:feed>
    <ns2:feed>
        <name>XXX</name>
    </ns2:feed>
</ns2:feeds>

LinqToXml を使用して Name プロパティのリストを取得するにはどうすればよいですか? 私が試したことは何もうまくいかないようです...

var doc = XDocument.Load(@"feed.xml");

var names = doc
.XPathSelectElements("/*/*[localname()='feeds']") //What should the Xpath be, here?
.Select(p => new 
{ 
    Name = p.Descendants("name").First().Value
})
.ToList();

これを達成する簡単な方法はありますか?

4

3 に答える 3

5

XPathSelectElementsでは、XPath クエリで名前空間を使用するために名前空間マネージャーを提供する必要があります。

var manager = new XmlNamespaceManager(new NameTable());
manager.AddNamespace("ns2", "XXXX");
manager.AddNamespace("ns", "XXXXX"); // default namespace

var names = from n in xdoc.XPathSelectElements("//ns2:feed/ns:name", manager)
            select (string)n;

XPath がなければ、検索するノードの名前を指定するときにXNamespaceを使用する必要があります。

XNamespace ns = "XXXXX";
XNamespace ns2 = "XXXX";

var names = from f in xdoc.Descendants(ns2 + "feed")
            select (string)f.Element(ns + "name");
于 2013-08-14T12:11:32.847 に答える
4

クエリでを取り除くにはnamespacesXLinQ以下で説明する同様の方法を使用します。

String xml_string = @"<ns2:feeds xmlns:ns2=""XXXX"" xmlns=""XXXXX"" version=""3.0"">
                          <ns2:feed>
                              <name>XXX</name>
                          </ns2:feed>
                          <ns2:feed>
                              <name>YYY</name>
                          </ns2:feed>
                          <ns2:feed>
                              <name>ZZZ</name>
                          </ns2:feed>
                      </ns2:feeds>";

var query = XElement.Parse(xml_string).Descendants()
           .Where(c => c.Name.LocalName.ToString() == "name")
           .ToArray();

foreach (String item in query)
{
    Console.WriteLine(item);
}
于 2013-08-14T13:10:07.973 に答える