我在从 LINQ to XML 查询获取一些值时遇到问题。我从 SOAP Web 服务获取了 XML,并将其传递并解析为 XDocument 进行查询
The XML:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetCollectionByUprnAndDateResponse xmlns=\"http://webservices.whitespacews.com/\">
<GetCollectionByUprnAndDateResult>
<ErrorCode>0</ErrorCode>
<ErrorDescription>Success</ErrorDescription>
<SuccessFlag>true</SuccessFlag>
<Collections>
<Collection>
<Service>Garden Waste Collection Service</Service>
<Round>RR3 GDN</Round>
<Schedule>TueFort2</Schedule>
<Day>Tuesday</Day>
<Date>01/04/2014</Date>
</Collection>
<Collection>
<Service>Recycling Collection Service</Service>
<Round>RR8 REC</Round>
<Schedule>TueFort2</Schedule>
<Day>Tuesday</Day>
<Date>01/04/2014</Date>
</Collection>
<Collection>
<Service>Refuse Collection Service</Service>
<Round>RR8 REF</Round>
<Schedule>TueFort1</Schedule>
<Day>Tuesday</Day>
<Date>08/04/2014</Date>
</Collection>
<Collection>
<Service>Garden Waste Collection Service</Service>
<Round>RR3 GDN</Round>
<Schedule>TueFort2</Schedule>
<Day>Tuesday</Day>
<Date>15/04/2014</Date>
</Collection>
<Collection>
<Service>Recycling Collection Service</Service>
<Round>RR8 REC</Round>
<Schedule>TueFort2</Schedule>
<Day>Tuesday</Day>
<Date>15/04/2014</Date>
</Collection>
<Collection>
<Service>Refuse Collection Service</Service>
<Round>RR8 REF</Round>
<Schedule>TueFort1</Schedule>
<Day>Tuesday</Day>
<Date>22/04/2014</Date>
</Collection>
</Collections>
</GetCollectionByUprnAndDateResult>
</GetCollectionByUprnAndDateResponse>
</soap:Body>
</soap:Envelope>
CS代码:
using (var reader = new StreamReader(response.GetResponseStream()))
{
string xmlString = reader.ReadToEnd();
XDocument xmlDoc = XDocument.Parse(xmlString);
var collections = (from p in xmlDoc.Descendants()
where p.Name.LocalName == "Collection"
select p);
var test = xmlDoc.Descendants("Collection").Select(
x => new
{
day = x.Element("Day").Value,
date = x.Element("Date").Value
});
Debug.WriteLine("STOP HERE");
var test2 = (from p in xmlDoc.Descendants()
where p.Name.LocalName == "Collection"
select new{
day = p.Element("Day").Value,
date = p.Element("Date").Value
});
}
上面的 collections var 给了我一个节点列表,但是 test 和 test2 var 没有给我子元素。
任何帮助表示赞赏!
这就是让你头疼的原因:
xmlns="http://webservices.whitespacews.com/"
这是为元素及其后代设置默认命名空间 - 因此您需要查找本地名称为Collections
和那个命名空间。其他元素也是如此。幸运的是,LINQ to XML 使您可以轻松实现这一点:
XNamespace ns = "http://webservices.whitespacews.com/";
...
var test = xmlDoc.Descendants(ns + "Collection")
.Select(x => new
{
day = x.Element(ns + "Day").Value,
date = x.Element(ns + "Date").Value
});
我怀疑你的test2
收藏would有元素,但是因为它无法找到Day
and Date
元素,因此获取Value
财产将导致NullReferenceException
.
另请注意,您无需创建自己的阅读器等。我会将您的代码编写为:
XNamespace ns = "http://webservices.whitespacews.com/";
XDocument doc;
using (var stream = response.GetResponseStream())
{
doc = XDocument.Load(stream);
}
var query = xmlDoc.Descendants(ns + "Collection")
.Select(x => new
{
Day = x.Element(ns + "Day").Value,
Date = x.Element(ns + "Date").Value
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)