web-dev-qa-db-ja.com

LINQを使用してXMLで名前で要素を取得する方法

ここでタイトルを選択したのは、例で言及したItemノードを取得する必要があるためです。私は次のXMLを使用していて、LINQを使用してそれをクエリすることに問題があります。以前はXMLを解析できましたが、何時間もこれに悩まされており、誰かが助けてくれることを願っています。以下が私のXMLデータです(データ例):

<a:entry xmlns:a="http://www.w3.org/2005/Atom">
<a:id>98765</a:id>
<info>Data Catalogue</info>
    <data>
    <items>
          <item>
                <id>123456</id>
                <value>Item One</value>
          </item>
          <item>
                <id>654321</id>
                <value>Item Two</value>
          </item>
        <items>
    </data>
    <items>
      <item>
        <id>123456</id>
        <value>Item One</value>
      </item>
      <item>
        <id>654321</id>
        <value>Item Two</value>
      </item>
    <items>
  <a:author>
    <a:name>Catalogue</a:name>
  </a:author>
</a:entry>

アイテムの下のアイテムXMLタグからIDを抽出できるようにしたいのですが、データの下にアイテムエントリを持つアイテムタグがあります。これらのノードはまったく必要ありません-これが表現されている場合は、ルート/アイテム/ ID/IDが必要ですパスとして。私はLINQで知っているすべてを試しましたので、誰かが助けてくれれば、これはシステムに基づいたサンプルデータですが、フォーマットを変更できないため、許容できる解決策ではありません。
どこに問題があるのか​​判断できないようです。私が試したすべてのLINQ式は何も返しません。名前空間は問題だと思い、これを統合しようとしましたが、私はサークルに入ります。
ソリューションはSilverlightおよびC#で機能する必要があります

私は以下を試しました:

    IEnumerable<XElement> nodes = 
element.Elements().Where(e => e.Name.LocalName == "items")

ただし、これにより、「データ」の下のアイテムを含むすべての「アイテム」が取得されます。


XMLで次の操作を行うと、要素の名前が表示されます。

XElement element = XElement.Parse(data);
foreach (XElement node in element.Elements())
{
  MessageBox.Show(node.Name.LocalName);
}

ただし、これを行うと、アイテムの下にノード名がまったく表示されません-XElementを確認しましたが、ノードがあるので、その上に名前を出力すると、「アイテム」が情報とIDとともに表示されます。

  foreach (XElement node in element.Elements("items"))
  {
    MessageBox.Show(node.Name.LocalName);
  }
14
RoguePlanetoid

element<a:entry>要素であると仮定します。

var ids = element.Element("items")
                 .Elements("item")
                 .Select(item => item.Element("id").Value);

ElementおよびElementsメソッドは、直接の子のみを返し、すべての子孫を返すわけではないため、<items>の下にある<data>要素を返しません

23
Thomas Levesque

XMLに空白の名前空間宣言がありましたが、これを機能するコードに追加すると気付かなかったため、LINQは非常に名前空間指向でした。

XNamespace ns = "http://example.org/namespace";
var ids = element.Element(ns + "items") 
                 .Elements("item") 
                 .Select(item => item.Element("id").Value); 
9
RoguePlanetoid