【问题标题】:How would I achieve the following XmlSerializer change for my class in C#?如何在 C# 中为我的类实现以下 XmlSerializer 更改?
【发布时间】:2017-05-03 21:45:06
【问题描述】:

我想生成以下 XML:

<Base>
    <Child>
        <Name>Joe</Name>
    </Child>
    <Child>
        <Name>Jack</Name>
    </Child>
</Base>

来自类:

public class Base
{
    public List<Child> children;
    ...elided...
}

public class Child
{
    public string Name;
    ...elided...
}

现在,它正在创建:

<Base>
    <children>
        <Child>
            <Name>Joe</Name>
        </Child>
        <Child>
            <Name>Jack</Name>
        </Child>
    </children>
</Base>

我将如何改变以产生所需的输出?

我当前的代码:

XmlSerializer serializer = new XmlSerializer(base.GetType());
serializer.serialze(stringWriter, base);
return stringWriter.ToString();

【问题讨论】:

    标签: c# .net xml xml-serialization xmlserializer


    【解决方案1】:

    使用XmlElementAttribute

    public class Base
    {
        [XmlElement(ElementName = "Child")]
        public List<Child> children;
    }
    

    ...完整示例...

    using System.Collections.Generic;
    using System.IO;
    using System.Text;
    using System.Xml.Serialization;
    
    class Program
    {
        static void Main()
        {
            var xsr = new XmlSerializer(typeof(Base));
    
            var b = new Base
            {
                children = new List<Child>
                    {
                        new Child { Name= "Joe"},
                        new Child { Name ="Jack"},
                    }
            };
            using (var ms = new MemoryStream())
            {
                xsr.Serialize(ms, b);
    
                var str = Encoding.UTF8.GetString(ms.ToArray());
                /*
                <?xml version="1.0"?>
                <Base xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                  <Child>
                    <Name>Joe</Name>
                  </Child>
                  <Child>
                    <Name>Jack</Name>
                  </Child>
                </Base>
                 */
            }
        }
    }
    
    public class Base
    {
        [XmlElement("Child")]
        public List<Child> children;
    }
    
    public class Child
    {
        public string Name;
    }
    

    【讨论】:

    • 补充一点:如果需要进一步提升列表项中的内容,可以将XmlTextAttribute应用于Child中的属性,以序列化为:&lt;Child&gt;Joe&lt;/Child&gt;&lt;Child&gt;Jack&lt;/Child&gt;
    【解决方案2】:

    您可以按如下方式使用 XmlElementAttribute:

    public class Base
    {
        [XmlElement("Child")]
        public List<Child> children;
        ...elided...
    }
    
    public class Child
    {
        public string Name;
        ...elided...
    }
    

    【讨论】:

      【解决方案3】:

      编辑:其他解决方案是您问题的更好和更直接的答案。但是,我将把它留在这里,因为在某些情况下扩展 List 而不是包含公共 List 成员可能是一个好主意。这是可能的解决方案。

      好吧,您可以实现 IXmlSerializable,但这对于您想要做的事情可能有点过头了。或者,您可以使 Base 扩展 List

      public class Base : List<Child>
      {
      }
      

      这当然会改变您在其余代码中引用子项的方式。如果你有 base.children[0],你应该使用 base[0]。

      【讨论】:

      • 比这更容易。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多