【问题标题】:C# XML serializing with attributes for every elementC# XML 序列化每个元素的属性
【发布时间】:2013-03-16 04:26:18
【问题描述】:

我想创建以下xml:

 <StartLot>
      <fileCreationDate level="7">201301132210</fileCreationDate>
      <fmtVersion level="7">3.0</fmtVersion>
 </StartLot>

下面是序列化代码:

[Serializable]
class StartLot
{
    public fileCreationDate{get; set;}

    [XmlAttribute("level")] 
    public string level = "7";

    public fmtVersion{get; set;}

    [XmlAttribute("level")] 
    public string level = "7"; ??
}

既然我已经声明了属性层级,那么如何添加最后一个属性呢?

【问题讨论】:

  • 你可能要创建另一种类型,看看这个答案stackoverflow.com/a/4154801/525138
  • [Serializable] 属性不会影响 XML 序列化,但它不应该破坏任何留下它的东西。

标签: c# xml


【解决方案1】:

您可以使用包装类来存储这两个值,如下例所示:

public class StackOverflow_15441384
{
    const string XML = @"<StartLot>
                               <fileCreationDate level=""7"">201301132210</fileCreationDate>
                               <fmtVersion level=""7"">3.0</fmtVersion>
                            </StartLot>";
    public class StartLot
    {
        [XmlElement("fileCreationDate")]
        public LevelAndValue FileCreationDate { get; set; }
        [XmlElement("fmtVersion")]
        public LevelAndValue FmtVersion { get; set; }
    }
    public class LevelAndValue
    {
        [XmlAttribute("level")]
        public string Level { get; set; }
        [XmlText]
        public string Value { get; set; }
    }
    public static void Test()
    {
        XmlSerializer xs = new XmlSerializer(typeof(StartLot));
        StartLot sl = (StartLot)xs.Deserialize(new MemoryStream(Encoding.UTF8.GetBytes(XML)));
        Console.WriteLine("FCD.L = {0}", sl.FileCreationDate.Level);
        Console.WriteLine("FCD.V = {0}", sl.FileCreationDate.Value);
        Console.WriteLine("FV.L = {0}", sl.FmtVersion.Level);
        Console.WriteLine("FV.V = {0}", sl.FmtVersion.Value);
    }
}

【讨论】:

    【解决方案2】:

    我总是觉得Linq To Xml 更容易使用

    var xDoc = XDocument.Parse(xml); /* XDocument.Load(filename); */
    
    var items = xDoc.Root.Descendants()
                    .Select(e => new
                    {
                        Name = e.Name.LocalName,
                        Level = e.Attribute("level").Value,
                        Value = e.Value
                    })
                    .ToList();
    

    【讨论】:

    • 我只是想知道您为什么要用手动 XML 生成/解析(尽管通过 Xlinq)替换基于 POCO 的序列化?另外,您的方法基本上排除了检查与架构的任何可能性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    相关资源
    最近更新 更多