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

无XML属性节点的C#中的XML序列化,c#,xml,xml-serialization,C#,Xml,Xml Serialization,我有一个来自遗留系统的XML文档格式,我必须在未来的应用程序中支持它。我希望能够在XML和C#对象之间序列化和反序列化XML,但是,使用xsd.exe生成的对象,C#序列化包括xmlns:xsi…,xsi:。。。生成的文档根元素上的etc XML属性。是否要禁用此功能,以便在生成的XML中绝对没有XML属性节点?XML文档应仅为元素 复制品 无法强制XML序列化程序忽略xsi属性(除非实现并强制自定义序列化或使用)。但是,xsi:attributes显示的唯一时间是当您有一个可为null的元素

我有一个来自遗留系统的XML文档格式,我必须在未来的应用程序中支持它。我希望能够在XML和C#对象之间序列化和反序列化XML,但是,使用xsd.exe生成的对象,C#序列化包括xmlns:xsi…,xsi:。。。生成的文档根元素上的etc XML属性。是否要禁用此功能,以便在生成的XML中绝对没有XML属性节点?XML文档应仅为元素



复制品

无法强制XML序列化程序忽略xsi属性(除非实现并强制自定义序列化或使用)。但是,xsi:attributes显示的唯一时间是当您有一个可为null的元素时。如果您确实需要使用可为null的元素,那么当然可以对XML进行后期处理以删除所有xsi:occurrence。但是,如果执行此操作,请考虑如何将XML反序列化回对象,如果元素上缺少xsi:nil,并且该元素定义为可为空的整数,则会遇到异常


@所以,如果我错了,请纠正我

我有以下代码

  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>


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

是的,使用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();

另请参见:

否,您可以禁止将未使用的xmlns:xsi属性发送到输出流。@Cheeso,如果我错了,请纠正我,我更新了答案。我发布的代码省略了不必要的xml命名空间。在您的情况下,xsi是一个必要的名称空间。关于一个相关的问题,请参阅。嗯,据我所知,如果您有一个可为null的元素“int?”并将其设置为null,这将迫使名称空间进入实际的元素。斯坦,我认为您是对的。此代码无法删除必要的XMLN。它只抑制输出中不必要的xmln。对于可为null的int,还有其他解决方案可以抑制xsi:nil。