簡體   English   中英

C# 序列化 object 成 xml 不格式化

[英]C# Serialize object into xml without formatting

我需要將 c# object 序列化為 xml,我可以像格式化部分那樣進行操作,但是我們可以在沒有縮進/新空格/extra的格式化的情況下實現它。 這是必需的,因為我們需要將整個 object 寫入 csv,因此我們需要一個縮小版本。 我嘗試了幾個 XmlWriterSettings,但沒有按預期工作。 任何代碼片段都會有很大幫助,並且要序列化的 object 可以具有其他引用類型作為可能從其他基本 class 繼承的成員,因此序列化程序可能需要已知類型

格式化 XML:

<ArrayOfStock xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Stock>
    <ProductCode>12345</ProductCode>
    <ProductPrice>10.32</ProductPrice>
  </Stock>
  <Stock>
    <ProductCode>45632</ProductCode>
    <ProductPrice>5.43</ProductPrice>
  </Stock>
</ArrayOfStock>

不格式化:

<ArrayOfStock xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Stock><ProductCode>123456</ProductCode><ProductPrice>10.57</ProductPrice></Stock><Stock><ProductCode>789123</ProductCode><ProductPrice>133.22</ProductPrice></Stock></ArrayOfStock>

代碼嘗試:

Type[] _knownExpressions = new Type[]
{
     typeof(SimpleExpression),
     typeof(CompositeExpression)
};
string expression = string.Empty;
MemoryStream ms = new MemoryStream();
DataContractSerializer dcs = new DataContractSerializer(typeof(Expression), _knownExpressions);                                        
using (XmlTextWriter xmlTextWriter = new XmlTextWriter(ms, System.Text.Encoding.Default))
{
      xmlTextWriter.Formatting = Formatting.None;
      dcs.WriteObject(xmlTextWriter, expression);
      xmlTextWriter.Flush();
      xmlTextWriter.BaseStream.Position = 0;
      StreamReader sr = new StreamReader(xmlTextWriter.BaseStream);
      expression = sr.ReadToEnd();
      sr.Close();
 }

別介意,我沒有將正確的 object 傳遞給序列化器,以下工作

Type[] _knownExpressions = new Type[]
{
     typeof(SimpleExpression),
     typeof(CompositeExpression)
};
string expression = string.Empty;
Expression exp = new Expression(){
   // Fill the object
};
MemoryStream ms = new MemoryStream();
DataContractSerializer dcs = new DataContractSerializer(typeof(Expression), _knownExpressions);                                        
using (XmlTextWriter xmlTextWriter = new XmlTextWriter(ms, System.Text.Encoding.Default))
{
      xmlTextWriter.Formatting = Formatting.None;
      dcs.WriteObject(xmlTextWriter, exp);
      xmlTextWriter.Flush();
      xmlTextWriter.BaseStream.Position = 0;
      StreamReader sr = new StreamReader(xmlTextWriter.BaseStream);
      expression = sr.ReadToEnd();
      sr.Close();
 }

Xml Writer 默認為 Ident = false。 所以以下將起作用:

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication137
{
    class Program
    {
        const string INPUT_FILENAME = @"c:\temp\test.xml";
        const string OUTPUT_FILENAME = @"c:\temp\test1.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(INPUT_FILENAME);
            XmlWriter writer = XmlWriter.Create(OUTPUT_FILENAME);
            doc.WriteTo(writer);
            writer.Flush();
            writer.Close();
        }

    }
}

暫無
暫無

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

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