【问题标题】:Getting rid of an array name in C# XML Serialization摆脱 C# XML 序列化中的数组名称
【发布时间】:2010-09-06 10:44:39
【问题描述】:

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

<Root Name="blah">
  <SomeKey>Eldad</SomeKey>
  <Element>1</Element>
  <Element>2</Element>
  <Element>3</Element>
  <Element>4</Element>
</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 serialization


    【解决方案1】:

    在数组上使用 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; } 
    } 
    

    【讨论】:

    • 使用字典,这是行不通的,因为我们需要手动浏览项目。 :(
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 2011-05-11
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      相关资源
      最近更新 更多