如何在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

如何在WindowsPhone7应用程序中解析XML

对于真正简单的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;
Viktor-XDocument.Load(字符串)尝试通过提供的文件名加载XDocument,而不是通过XML元素的字符串表示。

你说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>元素。