【问题标题】:How to parse XML in a Windows Phone 7 application如何在 Windows Phone 7 应用程序中解析 XML
【发布时间】:2013-01-27 04:42:29
【问题描述】:

有人能告诉我如何解析我从 wcf-rest 服务收到的 XML 字符串吗?

我的网络服务器 XML-String 看起来像

<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 将无法正确解析 web 服务输出。如果我删除名称空间,它工作正常。有人可以向我解释这个问题吗?是否有删除所有命名空间的便捷解决方案?

更新 3 删除命名空间的便捷方法1

【问题讨论】:

  • 我并没有真正涉足 WCF,但我很确定有更简单的方法来消费 WCF 服务。
  • 很抱歉,它可能是另一个未使用 wcf 实现的宁静服务。对于一般情况,手动解析它可能会更好,不是吗?

标签: c# windows-phone-7 xml-parsing webservice-client


【解决方案1】:

Viktor - XDocument.Load(string) 尝试通过提供的文件名加载 XDocument,而不是 XML 元素的字符串表示形式。

你说var answer = XElement.Parse(e.Result).Descendants("WS"); // null,但是哪一部分是空的?解析的 XElement 还是试图获取后代?如果&lt;WS&gt;...&lt;/WS&gt; 是您的根元素,那么.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"); 产生了 &lt;Info&gt;...&lt;/Info&gt; 元素。

【讨论】:

  • 非常正确,我相信XDocument.Parse(string) 就是他要找的。​​span>
  • 您对 XElement.Parse(e.Result).Descendants("Info") 的建议都不起作用。我无法 grep 该 xml 文件的任何节点,但如果查看 e.Result 预期的“Xml-String”存在。
  • 维克多——这很有趣。我把上面的 XML sn-p 放到一个字符串中,逐字逐句(省略号除外),然后通过 XElement.Parse() 运行它,产生结果 Info 元素。您是否在代码中设置了断点以查看调用 .Descendants("Info") 的结果?肯定有其他问题。
【解决方案2】:

如果您知道格式不会改变,那么使用非常简单的 XML,您可能会对使用 XPath 感兴趣:

var xdoc = XDocument.Parse(e.Result);
var name = xdoc.XPathSelectElement("/WS/Info/Name");

但对于多个页面,可能是一些 linq to 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 的 Info:

var info = xdoc.Descendants("Info").Single();
var InfoName = info.Element("Name").Value;
var InfoDescrip = info.Element("Description").Value;

【讨论】:

  • 感谢您的推荐,但 XPathSelectElement 在 WP7 上不可用。如果我尝试“var pages = xdoc.Descendants("pages").Single();”然后我得到“InvalidOperationException”-“序列不包含元素”
  • @ViktorZimmermann 抱歉,我不知道 XPath WP7 的限制。此外,我的代码中有一些小错误,但我已经用应该可以工作的测试代码进行了编辑。请告诉我。
猜你喜欢
  • 2012-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 2012-11-15
相关资源
最近更新 更多