我发现了很多关于这个主题的例子和问题,但我尝试过的结果都是空白的。
我需要从 xml 中取出第一个“列表”元素,我只需要 DisplayName 和 Address 信息。
var listings = from c in xdoc.Elements("listing") select c;
我发现了很多关于这个主题的例子和问题,但我尝试过的结果都是空白的。
我需要从 xml 中取出第一个“列表”元素,我只需要 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<>
.
另一个问题是你对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")
};
这将为您提供一个定义为匿名类型的 with,该类型由 Name 属性(作为 String)和 Address 属性(作为 XElement)组成IEnumerable<'a'>
。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;