【问题标题】:.NET c# Serialize to Parm Name and value.NET c# 序列化为参数名称和值
【发布时间】:2016-10-27 20:59:10
【问题描述】:

我有以下对象:

public class sampleObj
{
    public string MemberId {get;set;}
    public string Address {get;set;}
}

我正在与之交谈的服务期望属性名称在 <Parm/> 元素的名称属性中定义,其值在子 `' Xml 元素中,如下所示:

<Parm Name="SampleObj">
  <Parm Name="MemberId">
    <Value>1234</Value>
  </Parm>
  <Parm Name="Address">
    <Value>xyz</Value>
  </Parm>
</Parm>

当我将 sampleObj 序列化为 XML 时,我得到以下不正确的 XML:

<sampleObj>
  <MemberId>1234</MemberId>
  <Address>xyz</Address>
</sampleObj>

如何根据需要序列化我的对象?

【问题讨论】:

    标签: c# xml serialization


    【解决方案1】:

    你可以简单地使用 Linq2Xml(我发现它大多数时候更容易使用)

    var root = new XElement("Parm",
                    new XAttribute("Name", "SampleObj"),
                    new XElement("Parm",
                        new XAttribute("Name", "MemberId"),
                        new XElement("Value", "1234")
                    ),
                    new XElement("Parm",
                        new XAttribute("Name", "Address"),
                        new XElement("Value", "xyz")
                    )
                );
    
    var output = root.ToString();
    

    输出:

    <Parm Name="SampleObj">
      <Parm Name="MemberId">
        <Value>1234</Value>
      </Parm>
      <Parm Name="Address">
        <Value>xyz</Value>
      </Parm>
    </Parm>
    

    【讨论】:

    • 不仅仅是类的这两个属性。该类可能具有更多属性。寻找更通用的解决方案。
    【解决方案2】:
    /// <summary>
    /// When serialized, sampleObj is 'Parm' element
    /// </summary>
    [XmlRoot("Parm")]
    public class sampleObj
    {
        /// <summary>
        /// Name is an attribute of sampleObj/Parm
        /// </summary>
        [XmlAttribute("Name")]
        public string Name { get; set; }
    
        /// <summary>
        /// Value is an element of sampleObj/Parm
        /// </summary>
        [XmlElement("Value")]
        public string Value { get; set; }
    
        /// <summary>
        /// sampleObj has sampleObj list as elements
        /// </summary>
        [XmlElement("Parm")]
        public List<sampleObj> sampleObjs { get; set; }
    }
    

    产生结果:

    <?xml version="1.0" encoding="utf-8"?>
    <Parm Name="sampleObj">
      <Parm Name="MemberId">
        <Value>1234</Value>
      </Parm>
      <Parm Name="Address">
        <Value>xyz</Value>
      </Parm>
    </Parm>
    

    注意:

    如有必要,还有一些额外的步骤(使用 XmlSerializer 类)来删除指令。

    【讨论】:

    • Travis,除了说明如何做之外,发布一个工作代码怎么样?问题已经足够具体了......
    • 如何将属性名称作为属性(名称)值传递?。我实际上对那个序列化感到困惑,我能够定义它,但是在序列化时我遇到了问题。每个对象都需要序列化为 propertyvalue
    • 在顶级对象上将属性名称值设置为“sampleObj”将产生我提供的结果。我只假设您正在使用 XmlSerializer 的默认行为是仅序列化具有设置值的属性。
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多