没有XML属性节点的C#中的XML序列化

时间:2009-12-21 19:04:17

标签: c# xml xml-serialization

我有遗留系统的XML文档格式,我必须在将来的应用程序中支持。我希望能够在XML和C#对象之间序列化和反序列化XML,但是,使用xsd.exe生成的对象,C#序列化包括xmlns:xsi ...,xsi:... etc XML属性生成的文档的根元素。无论如何要禁用它,以便绝对没有XML属性节点被放在生成的XML中? XML文档应该只是元素。


重复? XmlSerializer: remove unnecessary xsi and xsd namespaces

2 个答案:

答案 0 :(得分:7)

是的,使用XmlSerializerNamespaces类。

示例:

  var s= new System.Xml.Serialization.XmlSerializer(typeof(TypeToSerialize));
  var ns= new System.Xml.Serialization.XmlSerializerNamespaces();
  ns.Add( "", "");
  System.IO.StreamWriter writer= System.IO.File.CreateText(filePath);
  s.Serialize(writer, objectToSerialize, ns);
  writer.Close();

另请参阅:XmlSerializer: remove unnecessary xsi and xsd namespaces

答案 1 :(得分:-1)

无法强制XML Serializer忽略xsi属性(除非您实现IXmlSerializable并强制自定义序列化或使用XmlAttributeOverrides)。但是,xsi:attributes出现的唯一时间是你有一个可以为空的元素。如果您确实需要使用可空元素,您当然可以对XML进行后处理以删除所有xsi:occurences。但是,如果这样做,请考虑如何将XML反序列化为对象,如果元素上缺少xsi:nil,并且元素被定义为可为空的整数,则会遇到异常。

@Cheeso,如果我错了,请纠正我。

我有以下代码。

  public class TestSer
    {
        public int? MyProperty { get; set; }   
    }





    TestSer ser = new TestSer();
    ser.MyProperty = null;

    StringBuilder bldr = new StringBuilder();
    var ns = new System.Xml.Serialization.XmlSerializerNamespaces();
    ns.Add("", "");
    XmlSerializer s = new XmlSerializer(typeof(TestSer));
    using (StringWriter writer = new StringWriter(bldr))
    {
        s.Serialize(writer, ser, ns);
    }

我得到以下输出。

<?xml version="1.0" encoding="utf-16"?>
<TestSer>
  <MyProperty d2p1:nil="true" xmlns:d2p1="http://www.w3.org/2001/XMLSchema-instance" />
</TestSer>

这不仅仅是问题所要求的元素。