0

重複の可能性:
LINQを使用してXMLからすべてのノードを読み取ります

C#WindowsアプリケーションでLinqを使用してXMLファイルを読み取ろうとしています。xml文字列のサンプルを以下に示します。

<Root>
<Name>John Doe</Name>
<Data>FBCCF14D504B7B2DBCB5A5BDA75BD93B</Data>
<customer>true</customer>
<Accounts>1</Accounts>
<dataSet>
     <Type1>Found matching records.</Type1>
    <Type2>No matches found.</Type2>
   <Type3>Found matching records.</Type3>
</dataSet>
</Root>

<dataset>タグ内のすべてのデータを表示したいのですが、タグも<datatag>読みたいです<customer>

メンバー(文字列型、文字列ステータス)を持つクラスを作成しました。タイプのどこにタイプ1、2 ...を保存し、ステータスのどこにタイプノード内にあるものを保存したいのか。

私はこれを達成することができますが、コードで私は与えなければなりません

type1 = (string)row.Element("type1"), type2=(string)row.Element("type2"), すべてのタイプについて言及する必要がない一般的なコードが欲しいです。言い換えれば、タグ名に言及せずに、タグのすべての子ノードを読み取りたいのです。私はグーグルでこれを検索するのに2時間を費やしましたが、まだ何も見つかりませんでした。

期待される出力

情報をクラスオブジェクト(タイプとステータス)に保存します。

そして、その人がすでに顧客であるかどうかを知ることができるように、顧客タグを読みたいです

どんな助けでも大歓迎です。

ありがとう

アップデート

RaphaëlAlthausから受け取った入力によると

私は次のコードを持っています:

var list = xml.Descendants("dataSet").Elements()
            .Select(m => new CustomerInfo
                             {
                                 Type = m.Name.LocalName,
                                 Value = m.Value
                             }).ToList();


        foreach (CustomerInfo item in list)
        {
            MessageBox.Show(item.Type+ "   "+item.Value);

        }

そして、Customerタグを読むために、私はより多くのコードを書きました。

var isCustomer = from customer in xmlDoc.Descendants("Root")
            select new
            {
              customer = tutorial.Element("customer").Value,
            }

1つのクエリで両方を実行できますか?または、この方法はパフォーマンスにそれほど重くはないので、これを使用できますか?

4

1 に答える 1

1

そんな感じ ?

var q = xml.Descendants("dataSet").Elements()
            .Select(m => new
                             {
                                 type = m.Name.LocalName,
                                 value = m.Value
                             }).ToList();

「クラスとメンバー」のリストに直接入力することもできます

var list = xml.Descendants("dataSet").Elements()
                .Select(m => new <TheNameOfYourClass>
                                 {
                                     Type = m.Name.LocalName,
                                     Value = m.Value
                                 }).ToList();

編集 :

「顧客」の値を取得するには、別のクエリを実行します

var customerElement = xml.Element("customer");
var isCustomer = customerElement != null && customerElement.Value == "true";

そのすべてを小さな関数に混ぜることができます

public IList<YourClass> ParseCustomers(string xmlPath, out isCustomer) {
    var xml = XElement.Load(xmlPath);
    var customerElement = xml.Element("customer");
    isCustomer = customerElement != null && customerElement.Value == "true";
    return xml.Descendants("dataSet").Elements()
                    .Select(m => new <YourClass>
                                     {
                                         Type = m.Name.LocalName,
                                         Value = m.Value
                                     }).ToList();
}
于 2012-05-10T11:51:24.873 に答える