3

私はLINQ/XMLの初心者です。統合言語クエリを使用してxmlを解析できることを学びました。次のXML構造を解析しようとしていますが、ヘルプが必要です

==================================

<config>

<params>
  <tp name="abc">yes</tp>
  <tp name="aee">no</tp>
  <tp name="bbc">no</tp>
  <tp name="ccb">yes</tp>
</params>

<nits>
  <tn name="kjh">
    <min>44</min>
    <max>98</max> 
  </tn>

  <tn name="klm">
    <min>55</min>
    <max>88</max> 
  </tn>

  <tn name="hhh">
    <min>44</min>
    <max>98</max> 
  </tn>
</nits>

<params>
  <tp name="lml">no</tp>
  <tp name="rre">yes</tp>
  <tp name="rst">no</tp>
  <tp name="wee">yes</tp>
</params>

<nits>
  <tn name="adf">
    <min>44</min>
    <max>98</max> 
  </tn>

  <tn name="ddd">
    <min>42</min>
    <max>92</max> 
  </tn>

  <tn name="kjj">
    <min>92</min>
    <max>98</max> 
  </tn>
</nits>

</config>

==================================

必要な出力:

私の目的は、上記のデータを、テキストファイルやデータグリッドなどのカテゴリごとにキーと値のペアとして表示することです。

<Params>
abc : yes
aee : no
bbc : yes
...
...
...
...


<nits>

kjh: 44 , 98
klm: 55 , 88
...
...
kjj: 92 , 98
ddd: 42 , 92
...

私がこれまでに書いたコードは、

static void QueryTheData(XDocument doc)
        {
            try
            {
                var a = doc.Descendants("config").Elements("params");
                var b = doc.Descendants("config").Elements("nits");

                var c = doc.Elements("tp");
                var d = doc.Elements("tn");

               /* to do :  parse the elements into key value pairs */
               /* Need hint or help to proceed to get key value pairs from xml data

            }
             catch(Exception e)
            {
                 ....
            }               
 }

初心者向けのLINQ/XML C#用の優れたポインタも必要です。

よろしくお願いします

4

4 に答える 4

2

私はこれを思いつきました:

using System.Linq;
using System.Xml.Linq;
using System.Xml.XPath;
using System.IO;
using System;

public class Program
{
    public static void Main(string[] args)
    {
        using (var fs = new StreamReader("./test.xml"))
        {
            var doc = XDocument.Load(fs);

            var parms = doc.Root.XPathSelectElements("params/tp")
                .ToDictionary(el => el.Attribute("name").Value, el => el.Value);

            var nits = doc.Root.XPathSelectElements("nits/tn")
                .Select(el => new {
                        Name = el.Attribute("name").Value,
                        Min  = (int) el.Element("min"),
                        Max  = (int) el.Element("max")
                    }).ToList();

            foreach (var kvp in parms)
                Console.WriteLine("{0}: {1}", kvp.Key, kvp.Value);

            foreach (var nit in nits
                    .OrderBy(nit => nit.Name)
                    .ThenBy(nit => nit.Max))
            {
                Console.WriteLine("{0}: {1} {2}", nit.Name, nit.Min, nit.Max);
            }
        }
    }
}

これは、params/nit をコレクション型に保存するためのさまざまなアプローチを含む、いくつかの要素を示しています。出力:

abc: yes
aee: no
bbc: no
ccb: yes
lml: no
rre: yes
rst: no
wee: yes
adf: 44 98
ddd: 42 92
hhh: 44 98
kjh: 44 98
kjj: 92 98
klm: 55 88
于 2012-09-21T22:34:33.253 に答える
1

「初心者向けの LINQ/XML C# への適切な指針も必要です。」

LINQ to XML の使用について説明している.NET Language-Integrated Query for XML Dataが役に立つかもしれません。

于 2012-09-21T22:14:34.480 に答える
1

各要素nameから属性とテキスト値を取得しますか? <tp>簡単だ:

// Parameters
var query = doc.Descendants("tp")
               .Select(tp => new { Name = tp.Attribute("name").Value,
                                   Value = tp.Value });

foreach (var result in query)
{
    Console.WriteLine("{0} : {1}", result.Name, result.Value);
}

最小/最大部分についても同様です。

var query = doc.Descendants("tn")
               .Select(tn => new { Name = tn.Attribute("name").Value,
                                   Min = (int) tn.Element("min"),
                                   Max = (int) tn.Element("max") });

foreach (var result in query)
{
    Console.WriteLine("{0}: {1}, {2}", result.Name, result.Min, result.Max);
}

もちろん、これは、XML がレイアウトしたスキーマに従っていることを前提としています。要素に適切な子または属性がない場合、失敗します。

于 2012-09-21T22:18:05.390 に答える
0

Jon Skeet の答えは、出力の params 部分を選択するためのトリックを行います。

初心者向けの LINQ/XML C# への適切な指針も必要です。

Jon Skeet によるC# in Depth, Second Editionをお勧めします。これは全体的に優れた C# の本であり、LINQ to XML の資料がいくつか含まれています。この本が届くのを待っている間、そして本の補足として LINQ to XML として、Microsoft の LINQ to XML ドキュメント をお勧めします。

于 2012-09-21T22:18:48.537 に答える