簡體   English   中英

沒有XML屬性節點的C#中的XML序列化

[英]XML Serialization in C# without XML attribute nodes

我有一個來自舊系統的XML文檔格式,將來的應用程序必須支持該格式。 我希望能夠在XML和C#對象之間對XML進行序列化和反序列化,但是,使用xsd.exe生成的對象,C#序列化包括xmlns:xsi ...,xsi:...等XML屬性生成的文檔的根元素。 無論如何,有沒有禁用它,以便在生成的XML中絕對不會出現XML屬性節點? XML文檔應僅是元素。


重復? XmlSerializer:刪除不必要的xsi和xsd命名空間

是的,使用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:刪除不必要的xsi和xsd命名空間

沒有強制XML序列化程序忽略xsi屬性的方法(除非您實現IXmlSerializable並強制自定義序列化或使用XmlAttributeOverrides )。 但是,只有當您具有可為空的元素時,才會顯示xsi:屬性。 如果確實需要使用可為空的元素,那么您當然可以對XML進行后處理,以刪除所有xsi:事件。 但是,如果您這樣做,將考慮如何將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>

這不僅僅是問題所要求的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM