0

このトピックに関する多くの例と質問を見つけましたが、私が試した結果は空白です。

xmlから、最初の「listing」要素を取得する必要があります。必要なのは、DisplayNameとAddressの情報だけです。

サンプル画像

var listings = from c in xdoc.Elements("listing") select c;
4

2 に答える 2

3

クエリに名前空間がありません。ノードの名前listingは名前空間ではありません+listing

したがって、要素の名前空間を取得するwpか、ローカル名プロパティを使用する必要があります。

var listings  = from c in xdoc.Descendants()
                where c.Name.LocalName == "listing"
                select c;

または、名前空間を取得してクエリに追加する必要があります

XNamespace ns = // namespace name here
var listings  = from c in xdoc.Descendants(ns + "listing") select c;

listingのバリエーションとして定義されIEnumerable<XElement>ます。正確なタイプは、使用したクエリによって異なりますが、重要なのは、から派生することIEnumerable<>です。

もう1つの問題は、Elements()メソッドの使用です。 Elements()で定義されたノードの子のみを検索しますxdocDescendants()子の子と他のすべての子ノードも調べます。


更新1-XMLから特定のノードを取得する方法の詳細を追加しました

アドレスと表示名の取得は基本的に同じプロセスです。実際、元のクエリに追加するか、別のクエリを使用することができます(後でどのように使用するかによって異なります。他の要素が必要になるか、wp:listingそれとも単にdisplaynameaddress?_

他の人が必要な場合は、後で結果をクエリできるように、別のクエリとして実行するのが理にかなっているようです。複数のクエリを相互にネストすると、私の意見では読みにくくなる可能性があるため、読みやすさも関係します。

アドレスを取得することは最も難しい部分です。あなたはそれをどのように望むかを決める必要があります...あなたXElementはすべてのアドレス部分を子ノードとして持つことを望みますか?または、新しいオブジェクトを作成しますか?それとも、連結された文字列が必要ですか?

ただし、一般的なクエリは次のようになります。

var result = from listing in listings
             select new
             {
                 Name = listing.Element(ns + "displayname").Value,
                 Address = listing.Element(ns + "address")
             };

これにより、Nameプロパティ(文字列として)とAddressプロパティ(XElementとして)で構成される匿名型として定義されたIEnumerable<'a'>withが得られます。a他のものが必要な場合はAddress = listing.Element(ns + "address")、適切なコード行に置き換える必要があります。

別の匿名タイプが必要な場合は、その行にネストされたクエリを配置する必要があります。

Address = from part in listing.Elements(ns + "address")
          select new
          {
              FullStreet = part.Element(ns + "fullstreet").Value,
              HouseNumber = part.Element(ns + "house").Value,
              Street = part.Element(ns + "street").Value,
              StreetType = part.Element(ns + "streettype").Value,
              // continue for all Elements you need/want
          };

または、クラスを作成Addressし、クエリでコンストラクターまたはファクトリメソッドを呼び出して、XElementまたはアドレス部分を渡すこともできます。

于 2012-05-22T15:08:18.847 に答える
0

Descendants代わりに使用してみてくださいElements

 var listings = from c in xdoc.Descendants("listing") select c;
于 2012-05-22T15:11:47.523 に答える