1

有人能告诉我如何解析我从 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(); 加载根元素 item 将分配给整个 xml 文件。

更新 2似乎根元素中的命名空间出现了问题。带有命名空间的 xdocument 将无法正确解析 web 服务输出。如果我删除名称空间,它工作正常。有人可以向我解释这个问题吗?是否有删除所有命名空间的便捷解决方案?

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

4

2 回答 2

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 的信息:

var info = xdoc.Descendants("Info").Single();
var InfoName = info.Element("Name").Value;
var InfoDescrip = info.Element("Description").Value;
于 2013-02-12T05:47:19.870 回答
0

Viktor - XDocument.Load(string)尝试通过提供的文件名加载 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>元素。

于 2013-02-12T05:34:03.517 回答