用属性标识的数据序列化XML

本文关键字:序列化 XML 数据 属性 标识 | 更新日期: 2023-09-27 18:04:45

我正在尝试序列化包含由id属性标识的'字段'元素中的数据的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来实现这个吗?

用属性标识的数据序列化XML

您可以使用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();

User s集合中获取XML:

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))))));

您可以在两者之间放置一个xslt样式表。将属性序列化和反序列化为"正常"XML,并从那里转换为所需的形式。

如何使用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"]);
相关文章: