【问题标题】:Can I serialize list elements as XML elements rather than as XML attributes我可以将列表元素序列化为 XML 元素而不是 XML 属性吗
【发布时间】:2014-02-10 00:09:14
【问题描述】:

我有以下 C# 代码:

    [Serializable][XmlInclude(typeof(TypeDefnType1))][XmlInclude(typeof(TypeDefnType2))]
public class TypeDefn
{
    [XmlElementAttribute("Z-ONE")]
    public int Z1;
    [XmlAttributeAttribute("IDENTIFIER")]
    public string id;
    public TypeDefn() { Z1 = 10; id = "IIIIDDDD" + Z1; }        
}
[Serializable]
public class TypeDefnType1 : TypeDefn
{
    [XmlElementAttribute("TYPE-ONE")]
    public int type1;
}
[Serializable]
public class TypeDefnType2 : TypeDefn 
{
    [XmlElementAttribute("TYPE-TWO")]
    public int type2;
}
[Serializable]
public class ContainsArr {
    [XmlElementAttribute("DATATYPES")]
    public List<TypeDefn> objs ;        
}
class Program
{
    static void Main(string[] args)
    {
            ContainsArr obj = new ContainsArr() ;
            obj.objs = new List<TypeDefn>();
            obj.objs.Add(new TypeDefnType1());
            obj.objs.Add(new TypeDefnType2());

            TextWriter write = new StreamWriter("MyNewClass.xml");

            XmlSerializer ser = new XmlSerializer(typeof(ContainsArr));
            ser.Serialize(write, obj);
    }
}

这会生成以下 xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<ContainsArr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<DATATYPES xsi:type="TypeDefnType1" IDENTIFIER="IIIIDDDD10">
    <Z-ONE>10</Z-ONE>
   <TYPE-ONE>0</TYPE-ONE>
</DATATYPES>
<DATATYPES xsi:type="TypeDefnType2" IDENTIFIER="IIIIDDDD10">
    <Z-ONE>10</Z-ONE>
    <TYPE-TWO>0</TYPE-TWO>
 </DATATYPES>
</ContainsArr>

因此,List 元素被序列化为 DATATYPE 的属性。 我想要的是这些元素显示为 DATATYPE 的元素。 所以我希望生成以下文件:

<?xml version="1.0" encoding="utf-8"?>
<ContainsArr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <DATATYPEs>
        <TypeDefnType1 IDENTIFIER="IIIIDDDD10">
            <Z-ONE>10</Z-ONE>
            <TYPE-ONE>0</TYPE-ONE>
        </TypeDefnType1>
    </DATATYPES>
    <DATATYPES>
        <TypeDefnType2 IDENTIFIER="IIIIDDDD10">
            <Z-ONE>10</Z-ONE>
            <TYPE-TWO>0</TYPE-TWO>
        </TypeDefnType2>
    </DATATYPES>

【问题讨论】:

    标签: c# xml-serialization


    【解决方案1】:

    您可以将 objs 列表序列化为 XML 数组,并为列表中不同类型的对象自定义项目名称(您应该删除您的 XmlInclude 属性):

    public class ContainsArr
    {
        [XmlArray("DATATYPES")]
        [XmlArrayItem("TypeDefnType1", Type = typeof(TypeDefnType1))]
        [XmlArrayItem("TypeDefnType2", Type = typeof(TypeDefnType2))]
        public List<TypeDefn> objs;
    }
    

    这将给出具有指定元素名称而不是属性的以下 xml:

    <?xml version="1.0"?>
    <ContainsArr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <DATATYPES>
        <TypeDefnType1 IDENTIFIER="IIIIDDDD10">
          <Z-ONE>10</Z-ONE>
          <TYPE-ONE>0</TYPE-ONE>
        </TypeDefnType1>
        <TypeDefnType2 IDENTIFIER="IIIIDDDD10">
          <Z-ONE>10</Z-ONE>
          <TYPE-TWO>0</TYPE-TWO>
        </TypeDefnType2>
      </DATATYPES>
    </ContainsArr>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多