我如何在 C# 中为我的 class 实现以下 XmlSerializer 更改?
How would I achieve the following XmlSerializer change for my class in C#?
我想制作以下内容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();
编辑:其他解决方案更好、更直接地回答了您的问题。但是,我将把它留在这里,因为在某些情况下扩展 List<> 而不是包含 public List 成员可能是个好主意。这是可能的解决方案。
好吧,您可以实施 IXmlSerializable,但这对于您想要做的事情来说可能有点过头了。或者,您可以使 Base 扩展 List.
public class Base : List<Child>
{
}
这当然会改变您在其余代码中引用子项的方式。如果你有 base.children[0],你会改用 base[0].
您可以按如下方式使用 XmlElementAttribute:
public class Base
{
[XmlElement("Child")]
public List<Child> children;
...elided...
}
public class Child
{
public string Name;
...elided...
}
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;
}
我想制作以下内容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();
编辑:其他解决方案更好、更直接地回答了您的问题。但是,我将把它留在这里,因为在某些情况下扩展 List<> 而不是包含 public List 成员可能是个好主意。这是可能的解决方案。
好吧,您可以实施 IXmlSerializable,但这对于您想要做的事情来说可能有点过头了。或者,您可以使 Base 扩展 List
public class Base : List<Child>
{
}
这当然会改变您在其余代码中引用子项的方式。如果你有 base.children[0],你会改用 base[0].
您可以按如下方式使用 XmlElementAttribute:
public class Base
{
[XmlElement("Child")]
public List<Child> children;
...elided...
}
public class Child
{
public string Name;
...elided...
}
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;
}