0

我发现了很多关于这个主题的例子和问题,但我尝试过的结果都是空白的。

我需要从 xml 中取出第一个“列表”元素,我只需要 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<>.

另一个问题是你对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")
             };

这将为您提供一个定义为匿名类型的 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 或地址部分。

于 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 回答