1

id属性で識別される「field」要素内のデータを含むXMLをシリアル化しようとしています。

<data>
  <row>
   <field id="firstName">Stef</field>
   <field id="lastName">Ben</field>
   <field id="city">LA</field>
   <field id="state">CA</field>
  </row>
  <row>
   <field id="firstName">Ann</field>
   <field id="lastName">Brown</field>
   <field id="city">NY</field>
   <field id="state">NY</field>
  </row>
</data>

私の目標は、次のようなクラスを作成することです。

class User
{
    private string firstName;
    [XmlElement("firstName")]
    public string FirstName { get; set; }     
    [XmlElement("lastName")]
    public string LastName { get; set; }
    [XmlElement("city")]
    public string City { get; set; }
    [XmlElement("state")]
    public string State { get; set; }
}

これを実現するために、このXMLをシリアル化および逆シリアル化する方法について何かアイデアはありますか?

4

3 に答える 3

1

LINQ to XMLを使用して、XMLをクエリできます。

var doc = XDocument.Load("Input.txt");
var users = doc.Root.Elements("row")
                    .Select(r => new User
                    {
                        FirstName = (string)r.Elements("field")
                                             .Single(f => (string)f.Attribute("id") == "firstName"),
                        LastName = (string)r.Elements("field")
                                            .Single(f => (string)f.Attribute("id") == "lastName"),
                        City = (string)r.Elements("field")
                                        .Single(f => (string)f.Attribute("id") == "city"),
                        State = (string)r.Elements("field")
                                         .Single(f => (string)f.Attribute("id") == "state"),
                    }).ToList();

のコレクションからXMLを取得するUser

var dox = new XDocument(new XElement("data",
                (from u in users
                select new XElement("row",
                    new XElement("field",
                        new XAttribute("id", "firstName"),
                        new XText(u.FirstName)),
                    new XElement("field",
                        new XAttribute("id", "lastName"),
                        new XText(u.LastName)),
                    new XElement("field",
                        new XAttribute("id", "city"),
                        new XText(u.City)),
                    new XElement("field",
                        new XAttribute("id", "state"),
                        new XText(u.State))))));
于 2013-03-18T20:48:14.427 に答える
0

Linqを使用して辞書のリストを作成するのはどうですか

var xDoc = XDocument.Parse(xml); //XDocument.Load(filename);
var rows = xDoc.Descendants("row")
               .Select(r => r.Elements()
                             .ToDictionary(f=>f.Attribute("id").Value,f=>f.Value))
               .ToList();

Console.WriteLine(rows[0]["firstName"]);
于 2013-03-18T20:57:27.343 に答える
0

xsltスタイルシートを間に置くことができます。「通常の」XMLへの属性を使用してシリアル化および逆シリアル化し、そこから目的の形式に変換します。

于 2013-03-18T21:21:24.523 に答える