1

誰かがwcf-restサービスから受け取ったXML文字列を解析する方法を教えてもらえますか?

私のwebseriveXML-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サービスの出力を正しく解析しません。名前空間を削除すると、正常に機能します。誰かが私にこの問題を説明できますか?そして、すべての名前空間を削除するための便利なソリューションはありますか?

update3名前空間を削除するための便利な方法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)は、XML要素の文字列表現ではなく、指定されたファイル名でXDocumentをロードしようとします。

あなたは言う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 に答える