2012-05-22 155 views
0

我发现了很多关于这个主题的例子和问题,但是我试过的结果是空白的。使用LINQ解析XML流

从xml中我需要从那里得到第一个'listing'元素,我只需要显示名称和地址信息。

sample image

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

回答

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()将仅搜索由xdoc定义的节点的子节点。 Descendants()也将查看孩子和所有其他孩子节点的孩子。


更新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属性的(作为一个字符串)匿名类型和地址属性aIEnumerable<'a'>(如一个XElement)。如果你想要别的东西,你必须用适当的代码行代替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或地址部分。

+0

我得到一个对象,但我不能用它做任何事情。 – Ezi

+0

你是什么意思的一个对象?实际上列出了一个'object'类型吗?或者它是IEnumerable <>'的一些变体? – psubsee2003

+0

它只是一个对象。 – Ezi

0

尝试使用Descendants代替Elements

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