4

xml ファイルを解析する必要があり、ノード 'driver' からの結果を結合する必要があります。
すべての「ブランド」ノードは一意です。

サンプル xml ファイル:

<brand name = "ford">   
   <transport category="car">
      <driver name="John, Doe"/>
      <driver name="Jane, Doe"/>
    </transport>
</brand>
<brand name = "opel">
   <transport category="car">
      <driver name="Jerry, Smith"/>
      <driver name="Jeff, Perry"/>
     </transport>
</brand>


期待される結果:

John, Doe - Jane, Doe
Jerry, Smith - Jeff, Perry


これまでの私のコード:

    XmlTextReader reader = new XmlTextReader(@"D:\myfile.xml");

    while (reader.Read())
    {
        if (reader.Name == "brand")
            {
                XmlReader inner =  reader.ReadSubtree();
                while (inner.Read()) ;

                if (reader.Name == "driver")
                {
                    string drvNames = reader.GetAttribute("name");
                }   
            }
    }


「ドライバー」の結果を取得できません。
1つまたは複数の「ドライバー」ノードがあります。
言語 C#

4

2 に答える 2

3

Linq を Xml に使用できます。

var xdoc = XDocument.Load(@"D:\myfile.xml");
var query = from t in xdoc.Descendants("transport")
            select String.Join(" - ", t.Elements("driver")
                                      .Select(e => (string)e.Attribute("name")));

ファイル全体をメモリにロードできない場合:

XmlTextReader reader = new XmlTextReader(@"D:\myfile.xml");
List<string> result = new List<string>();

while (reader.Read())
{    
    if (reader.Name == "brand")
    {
        XmlReader inner = reader.ReadSubtree();
        List<string> names = new List<string>();

        while (inner.Read())
        {
            if (reader.Name == "driver")
                names.Add(reader.GetAttribute("name"));
        }

        if (names.Any())
            result.Add(String.Join(" - ", names));
    }
}
于 2013-01-07T17:23:56.160 に答える
1
using System;
using System.Linq;
using System.Xml.Linq;


class Program
{
    static void Main(string[] args)
    {
        string xml = @"<root>
                        <brand name = 'ford'>   
                           <transport category='car'>
                              <driver name='John, Doe'/>
                              <driver name='Jane, Doe'/>
                            </transport>
                        </brand>
                        <brand name = 'opel'>
                           <transport category='car'>
                              <driver name='Jerry, Smith'/>
                              <driver name='Jeff, Perry'/>
                           </transport>
                        </brand></root>";
        XDocument doc = XDocument.Parse(xml);
        var transports = from t in doc.Root.Elements()
                         select new
                         {
                             Category = t.Attribute("name").Value.Trim(),
                             Drivers = t.Element("transport")
                                        .Elements()
                                        .Select(x => new { Name = x.Attribute("name").Value.Trim() })
                         };
        foreach (var t in transports)
        {
            Console.WriteLine(t.Category);
            foreach (var driver in t.Drivers)
                Console.WriteLine(driver.Name.PadLeft(15));
        }
        Console.ReadKey(true);
    }
}
于 2013-01-07T17:28:37.297 に答える