ここでタイトルを選択したのは、例で言及した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);
}
element
が<a:entry>
要素であると仮定します。
var ids = element.Element("items")
.Elements("item")
.Select(item => item.Element("id").Value);
Element
およびElements
メソッドは、直接の子のみを返し、すべての子孫を返すわけではないため、<items>
の下にある<data>
要素を返しません
XMLに空白の名前空間宣言がありましたが、これを機能するコードに追加すると気付かなかったため、LINQは非常に名前空間指向でした。
XNamespace ns = "http://example.org/namespace";
var ids = element.Element(ns + "items")
.Elements("item")
.Select(item => item.Element("id").Value);