このトピックに関する多くの例と質問を見つけましたが、私が試した結果は空白です。
xmlから、最初の「listing」要素を取得する必要があります。必要なのは、DisplayNameとAddressの情報だけです。
var listings = from c in xdoc.Elements("listing") select c;
このトピックに関する多くの例と質問を見つけましたが、私が試した結果は空白です。
xmlから、最初の「listing」要素を取得する必要があります。必要なのは、DisplayNameとAddressの情報だけです。
var listings = from c in xdoc.Elements("listing") select c;
クエリに名前空間がありません。ノードの名前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()
で定義されたノードの子のみを検索しますxdoc
。 Descendants()
子の子と他のすべての子ノードも調べます。
更新1-XMLから特定のノードを取得する方法の詳細を追加しました
アドレスと表示名の取得は基本的に同じプロセスです。実際、元のクエリに追加するか、別のクエリを使用することができます(後でどのように使用するかによって異なります。他の要素が必要になるか、wp:listing
それとも単にdisplayname
とaddress
?_
他の人が必要な場合は、後で結果をクエリできるように、別のクエリとして実行するのが理にかなっているようです。複数のクエリを相互にネストすると、私の意見では読みにくくなる可能性があるため、読みやすさも関係します。
アドレスを取得することは最も難しい部分です。あなたはそれをどのように望むかを決める必要があります...あなた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またはアドレス部分を渡すこともできます。
Descendants
代わりに使用してみてくださいElements
var listings = from c in xdoc.Descendants("listing") select c;