如何删除根元素

时间:2017-04-20 12:39:15

标签: c# xml-serialization xmlserializer

很抱歉这个简单的问题,但我找不到答案......

internal class Program
{
    private static void Main(string[] args)
    {
        var x = new Test[] {new Test() {X = 1}, new Test() {X = 2}};
        var serializer = new XmlSerializer(typeof(Test[]));
        serializer.Serialize(Console.Out, x);
    } 
}

public class Test
{
    public int X { get; set; }
}

返回

<ArrayOfTest>
  <Test>
    <X>1</X>
  </Test>
  <Test>
    <X>2</X>
  </Test>
</ArrayOfTest>

如何删除<ArrayOfTest>?我只发现了如何重命名根元素。如果在Test[]内部另一个类(我们可以使用[XmlElement("Test")])的情况下如何删除。

2 个答案:

答案 0 :(得分:1)

您必须创建另一个包装Test类的类:

[XmlRoot("Tests")]
public class Tests: List<Test>
{
}

现在将外部元素命名为&#34; Tests&#34;。

现在使用带有新包装类的序列化程序:

var serializer = new XmlSerializer(typeof(Tests));

编辑:如果你想删除一个级别的标签,可以选择其他选项,但我不确定它是否更清晰(但可能更适合您的需求):

class Program
{
    static void Main(string[] args)
    {
        var x = new Tests { 1, 2, 3 };
        var serializer = new XmlSerializer(typeof(Tests));
        serializer.Serialize(Console.Out, x);
    }        
}

[XmlRoot("Tests")]
public class Tests : List<int>
{
}

输出:

<Tests>
    <int>1</int>
    <int>2</int>
</Tests>

答案 1 :(得分:0)

如果您不想使用正确的格式,而只需要信息本身与测试对象,请将其写入MemoryStream(System.IO),然后切断第一行和最后一行。

var x = new Test[] { new Test() { X = 1 }, new Test() { X = 2 } };
var serializer = new XmlSerializer(typeof(Test[]));
MemoryStream ms = new MemoryStream();
serializer.Serialize(ms, x);
ms.Position = 0;
byte[] data = new byte[ms.Length];
ms.Read(data, 0, Convert.ToInt32(ms.Length));
string xmlSerializedObject = Encoding.UTF8.GetString(data, 0, Convert.ToInt32(ms.Length)));`