如何使用XML序列化更改XML根元素名称?

11

我正在尝试使用C#进行XML序列化时更改根元素的名称。

它总是采用类名而不是我尝试设置的名称。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {


            MyTest test = new MyTest();
            test.Test = "gog";

            List<MyTest> testList = new List<MyTest>() 
            {    
                test 
            }; 

            SerializeToXML(testList);
        }

        static public void SerializeToXML(List<MyTest> list)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(List<MyTest>));
            TextWriter textWriter = new StreamWriter(@"C:\New folder\test.xml");
            serializer.Serialize(textWriter, list);
            textWriter.Close();
        }
    }


}





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

namespace ConsoleApplication1
{

    [XmlRootAttribute(ElementName = "WildAnimal", IsNullable = false)]
    public class MyTest
    {
        [XmlElement("Test")]
        public string Test { get; set; }


    }
}

结果

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfMyTest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <MyTest>
    <Test>gog</Test>
  </MyTest>
</ArrayOfMyTest>

它不会将其更改为WildAnimal。我不确定原因。我是从教程中获取的。

编辑 @Marc

谢谢。我现在明白你正在做什么,只是看起来很奇怪,你需要在它周围加一个包装器。 我还有一个问题,如果我想要制作这种格式,会发生什么

<root>
   <element>
        <name></name>
   </element>
   <anotherElement>
       <product></product> 
   </anotherElement>
</root>

那就像嵌套元素一样。我是否需要为第二部分创建一个新类,然后将其放入包装类中?


关于你的编辑;这取决于你是想要每个product一个anotherElement,还是一个带有很多product元素的单一anotherElement。对于后者:[XmlArray] / [XmlArrayItem] - 否则是的:需要第二个类型。 - Marc Gravell
1个回答

14
在你的例子中,MyTest 不是根目录; 你想要重命名数组吗?我会写一个包装器:

在你的例子中,MyTest 不是根目录;你是想要重命名数组吗?我会写一个包装器:

[XmlRoot("NameOfRootElement")]
public class MyWrapper {
    private List<MyTest> items = new List<MyTest>();
    [XmlElement("NameOfChildElement")]
    public List<MyTest> Items { get { return items; } }
}

static void Main() {
    MyTest test = new MyTest();
    test.Test = "gog";

    MyWrapper wrapper = new MyWrapper {
        Items = {  test }
    };
    SerializeToXML(wrapper);
}

static public void SerializeToXML(MyWrapper list) {
    XmlSerializer serializer = new XmlSerializer(typeof(MyWrapper));
    using (TextWriter textWriter = new StreamWriter(@"test.xml")) {
        serializer.Serialize(textWriter, list);
        textWriter.Close();
    }
}

我想我正在尝试更改“ArrayOfMyTest”的名称,我以为MyTest是根,那只是序列化所需的东西。那么我该怎么处理这个包装器?就像现在如何将其序列化? - chobo2
@chobo2 - 我已经提供了一个完整的示例,包括 MainSerializeToXMLMyWrapper - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接