删除 C# XML 序列化中的数组名称

Getting rid of an array name in C# XML Serialization

提问人:Eldad Mor 提问时间:9/6/2010 更新时间:12/4/2013 访问量:5799

问:

我试图在序列化XML时得到这个结果:

<Root Name="blah">
  <SomeKey>Eldad</SomeKey>
  <Element>1</Element>
  <Element>2</Element>
  <Element>3</Element>
  <Element>4</Element>
</root>

或者换句话说 - 我正在尝试在“root”元素中包含一个数组,以及其他键。

这是我粗略的尝试:

[XmlRootAttribute(ElementName="Root", IsNullable=false)]
public class RootNode
{
    [XmlAttribute("Name")]
    public string Name { get; set; }

    public string SomeKey { get; set; }

    [XmlArrayItem("Element")]
    public List<int> Elements { get; set; }
}

还有我的连载:

string result;
XmlSerializer serializer = new XmlSerializer(root.GetType());
StringBuilder sb = new StringBuilder();
using (StringWriter sw = new StringWriter(sb))
{
    serializer.Serialize(sw, root);
    result = sw.ToString();
}

但是,这是我的结果(为清楚起见,删除了命名空间):

<Root>
  <SomeKey>Eldad</SomeKey>
  <Elements>
    <Element>1</Element>
    <Element>2</Element>
    <Element>3</Element>
  </Elements>
</Root>

有什么方法可以删除“元素”部分吗?

C# XML 序列化

评论


答:

18赞 Chris Taylor 9/6/2010 #1

在 Array 上使用 XmlElement 属性,这将指示序列化程序将数组项序列化为当前元素的子元素,而不是为数组创建新的根元素。

[XmlRootAttribute(ElementName="Root", IsNullable=false)] 
public class RootNode 
{ 
    [XmlAttribute("Name")] 
    public string Name { get; set; } 

    public string SomeKey { get; set; } 

    [XmlElement("Element")] 
    public List<int> Elements { get; set; } 
} 

评论

0赞 Nolmë Informatique 11/6/2015
使用字典,这不起作用,因为我们需要手动浏览项目。:(
-1赞 Simon White 12/4/2013 #2

感谢克里斯·泰勒(Chris Taylor)也为我的问题提供了答案。使用 asmx Web 服务,我得到以下 XML:

<Manufacturers>
    <Manufacturer>
        <string>Bosch</string>
        <string>Siemens</string>
    </Manufacturer>
</Manufacturers>

我想直接在元素中获取制造商名称,像这样删除元素:

<Manufacturers>
    <Manufacturer>Bosch</Manufacturer>
    <Manufacturer>Siemens</Manufacturer>
</Manufacturers>

对于其他有相同问题的人,我实现此目的的代码(VB.Net)是:

<WebMethod()> _
Public Function GetManufacturers() As Manufacturers
    Dim result As New Manufacturers
    result.Manufacturer.Add("Bosch")
    result.Manufacturer.Add("Siemens")
    Return result
End Function

<XmlRoot(ElementName:="Manufacturers")> _
Public Class Manufacturers
    <XmlElement("Manufacturer")> _
    Public Manufacturer As New List(Of String)
End Class