如何在WindowsPhone7应用程序中解析XML
本文关键字:XML 应用程序 WindowsPhone7 | 更新日期: 2023-09-27 17:58:40
有人能告诉我如何解析从wcf-rest服务接收的XML字符串吗?
我的weberive XML字符串看起来像
<WS>
<Info>
<Name>Beta</Name>
<Description>Prototyps</Description>
</Info>
<Pages>
<Page>
<Name>Custom</Name>
<Description>toDo</Description>
</Page>
...many other pages...
</Pages>
</WS>
我的手机源代码:
public void DownloadCompleted(Object sender, DownloadStringCompletedEventArgs e)
{
if (!e.Cancelled && e.Error == null)
{
var answer = XElement.Parse(e.Result).Descendants("WS"); // null
...
}
}
如果我试图通过XDocument.Load(e.Result)解析它,那么我会得到异常:找不到文件。
我只想要";独特的";信息节点的信息和所有页面节点的列表及其值
更新即使我试图通过var item=xdoc加载根元素。Root.Descendants();项将被分配给整个xml文件。
更新2似乎根元素中的名称空间出现了问题。对于命名空间,xdocument将无法正确解析webservice输出。如果我删除名称空间,它可以正常工作。有人能给我解释一下这个问题吗?有没有一个方便的解决方案可以删除所有名称空间?
更新3删除命名空间的简便方法1
对于真正简单的XML,如果您知道格式不会改变,您可能会对使用XPath:感兴趣
var xdoc = XDocument.Parse(e.Result);
var name = xdoc.XPathSelectElement("/WS/Info/Name");
但是对于多个页面,可能需要一些linq到xml
var xdoc = XDocument.Parse(xml);
var pages = xdoc.Descendants("Pages").Single();
var PagesList = pages.Elements().Select(x => new Page((string)x.Element("Name"), (string)x.Element("Description"))).ToList();
Page是一个简单的类:
public class Page
{
public string Name { get; set; }
public string Descrip { get; set; }
public Page(string name, string descrip)
{
Name = name;
Descrip = descrip;
}
}
如果你需要更多的解释,请告诉我。
还要选择不带XPath的信息:
var info = xdoc.Descendants("Info").Single();
var InfoName = info.Element("Name").Value;
var InfoDescrip = info.Element("Description").Value;
你说var answer = XElement.Parse(e.Result).Descendants("WS"); // null
,但哪个部分是空的?解析的XElement还是试图获取子代?如果<WS>...</WS>
是根元素,那么.Descendents("WS")
调用会返回根元素吗?根据XElement.DescendantsAndSelf()的文档,我猜不是。你有没有试着打电话给:
var answer = XElement.Parse(e.Result).Descendants("Info");
我这边的一个快速测试表明,在WS作为根元素的情况下,调用XElement.Parse(e.Result).Descendants("WS");
没有结果,而XElement.Parse(e.Result).Descendants("Info");
生成了<Info>...</Info>
元素。