2

したがって、次のような XML があるとします。

<people>
    <person>
        <name>a</name>
    </person>
    <person>
        <name>b</name>
    </person>
</people>

これを「people」と呼ばれる C# 配列に解析する最良/最も簡単な方法は何ですか?ここで people[0] は最初の人物オブジェクトです。次に、どのようにフォーマットされ、どのようにアクセスしますか?

ありがとう!

4

6 に答える 6

4

LINQ-To-Xmlを使用して、このファイルを配列に読み込むことができます。

それらをロードした後にオブジェクトを単純に処理するには、人を表すクラスを作成できます。

public class Person
{
    public string Name { get; set; }
} 

XElement.Load次に、 -methodを使用してファイルをロードします。

var document = XElement.Load("persons.xml");
var persons = document.Elements("Person")
    .Select(p => new Person{ Name = p.Element("Name").Value }
    .ToArray();
于 2013-02-06T22:59:03.940 に答える
2

私のC#はさびていますが、これはXMLシリアル化を使用すると十分に簡単です

逆シリアル化(読み取り)、変更、およびシリアル化(書き込み):

using System;
using System.IO;
using System.Xml.Serialization;

namespace ConsoleApplication1
{

    [XmlRoot("people")]
    public class People
    {
        [XmlElement("person")]
        public Person[] person { get; set; }
    }

    [Serializable]
    public class Person
    {
        [XmlElement("name")]
        public string Name { get; set; }
    }

    class Program
    {
        public static void Main(string[] args)
        {
            People people = null;
            XmlSerializer serializer = new XmlSerializer(typeof(People));
            using (StreamReader reader = new StreamReader("people.xml"))
            {
                people = (People)serializer.Deserialize(reader);
            }
            people.person[0].Name = "Dan";
            using (StreamWriter writer = new StreamWriter("people.xml"))
            {
                serializer.Serialize(writer, people);
            }
        }
    }
}
于 2013-02-06T23:49:38.790 に答える
1

LinqToXmlで簡単に実行できます。

var doc = XDocument.Parse(myXmlString); // .Load("filepath");
var persons = doc.Root
                 .Elements("Person")
                 .Select(x=> new Person {Name= x.Element("Name").Value})
                 .ToArray();

Person以下のように定義された の配列を返します。

public class Person{
     public string Name {get; set;}
}
于 2013-02-06T22:56:56.117 に答える
0

仮定:

class Person
{
    public string Name { get; set; }
}

次に (クエリ構文):

var arr = (from p in XDocument.Load(path) // or .Parse(str)
                              .Root
                              .Elements("person")
           select new Person
           {
               Name = (string)p.Attribute("name")
           }).ToArray();

拡張メソッドの構文でも同じです:

XDocument.Load(path)
         .Root
         .Elements("person")
         .Select(p => new new Person
             {
                 Name = (string)p.Attribute("name")
             })
         .ToArray();
于 2013-02-06T22:57:20.057 に答える
0
var doc = XDocument.Parse(input);
string[] names = doc.Root.Descendants("name").Select(x => x.Value).ToArray();

入力 xml 形式が上記のステートメントと同じくらい単純である場合は、それで十分ですが、それ以外の場合は、次の where 句を追加nameして、xml ファイル内の他の要素をキャプチャしないようにします。

string[] names = doc.Root.Descendants("name")
                        .Where(x => x.Parent.Name == "person")
                        .Select(x => x.Value).ToArray();
于 2013-02-06T23:00:03.397 に答える
0

1行で十分です。

var people=XDocument.Load(path).Root.Elements().Select(y => y.Elements().ToDictionary(x => x.Name, x => x.Value)).ToArray();

テスト用に次の名前空間を指定する必要があります

using System.Xml.Linq;
using System.Collections.Generic;
using System.Collections;
using System.Linq;

テストコード

var path=@"c:\people.xml";
var people=XDocument.Load(path).Root.Elements().Select(y => y.Elements().ToDictionary(x => x.Name, x => x.Value)).ToArray();

foreach(var person in people) {
    Console.WriteLine("name = {0}", person["name"]);
    Console.WriteLine("name = {0}", person["age"]); // requires person have a age defined in your xml file
}

テスト用のサンプル xml

<people>
    <person>
        <name>Humbert Humbert</name>
        <age>36</age>
    </person>

    <person>
        <name>Lolita</name>
        <age>12</age>
    </person>
</people>
于 2013-02-06T23:18:37.463 に答える