4

だから私は一般的にこのようなXMLを持っています

<wd:Data xmlns:wd="urn:com.foo.bar/GetResult">
    <wd:Result>
        <wd:field1>lorem</wd:field1>
        <wd:field2>ipsum</wd:field2>
        <wd:field3>dolor</wd:field3>
        <wd:field4>sit</wd:field4>
    </wd:Result>
</wd:Data>

名前空間には「wd」という接頭辞が付きます

内部の各要素を取得して、キーが要素名で、値が次のように要素の値で<wd:Result>...</wd:Result>ある新しいものを作成できるようにしたいと思います。KeyValuePair<string, string>

{"field1", "lorem"} {"field2", "ipsum"} {"field3", "dolor"} {"field4", "sit"}

私の苦労は、名前空間のプレフィックスです。私はLINQの初心者ですが、次のようなコードで動作するように常にこのようなものを得ることができました:

var data = XElement.Parse(theXml); 
XNamespace ns = "urn:com.foo.bar/GetResults"; 
var result = data.Elements(ns + "Result")
                 .Select(x => new KeyValuePair<string, string>(x.Name.LocalName, x.Value))
                 .ToList();

目的の結果を得るには、このデータをどのようにクエリすればよいですか?

私は LINQ とは結婚していないので、コミュニティが最も良いと感じるものは何でも構いません。

4

3 に答える 3

5

Descendants() と Elements() を組み合わせる必要があることがわかりました

次のコードは、まさに私が求めていたものを達成しました:

    var data = XElement.Parse(theXml);  
    XNamespace ns = "urn:com.foo.bar/GetResults";  
    var result = data.Descendants(ns + "Result")
                     .Elements()
                     .Select(x => new KeyValuePair<string, string>(x.Name.LocalName, x.Value))
                     .ToList();
于 2012-10-03T20:51:00.980 に答える
2

これは完全な解決策ではありませんが、XML 内で名前空間を使用し、LINQ でデータを読み取ることに関する基本的な考え方を理解する必要があると思います

既に XML をメモリにロードしているとは言いませんが、これにアクセスする方法は次のとおりです。

XDocument inventory = XDocument.Load("path_to_your_file.xml");

XNamespace vs = "urn:com.foo.bar/GetResult";
var names = doc.Descendants(vs + "Result")
           .Select(x => (string) x)
           .ToList();

これは XML 構造の正確な実装ではありませんが、名前空間の操作方法については理解できたと思います

于 2012-10-03T20:38:19.413 に答える
0

localname プロパティを使用して、次のようなことを行うこともできます

var names  = from n in xdoc.Descendants() where n.Name.LocalName == "Result" select n;
于 2016-10-04T19:15:33.803 に答える