我发现了很多关于这个主题的例子和问题,但是我试过的结果是空白的。使用LINQ解析XML流
从xml中我需要从那里得到第一个'listing'元素,我只需要显示名称和地址信息。
var listings = from c in xdoc.Elements("listing") select c;
我发现了很多关于这个主题的例子和问题,但是我试过的结果是空白的。使用LINQ解析XML流
从xml中我需要从那里得到第一个'listing'元素,我只需要显示名称和地址信息。
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")
};
这将使你定义为由Name属性的(作为一个字符串)匿名类型和地址属性a
的IEnumerable<'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或地址部分。
尝试使用Descendants
代替Elements
var listings = from c in xdoc.Descendants("listing") select c;
我得到一个对象,但我不能用它做任何事情。 – Ezi
你是什么意思的一个对象?实际上列出了一个'object'类型吗?或者它是IEnumerable <>'的一些变体? – psubsee2003
它只是一个对象。 – Ezi