C # Сериализация объекта в XML без форматирования - PullRequest
0 голосов
/ 18 октября 2019

Мне нужно сериализовать объект ac # в xml, я мог бы сделать это как в отформатированном разделе, но можно ли добиться этого без форматирования, в котором нет отступов / лишних пробелов / новых строк. Это необходимо, так как нам нужно записать весь объект в CSV, поэтому нам нужна уменьшенная версия. Я попытался пару XmlWriterSettings, но это не сработало, как ожидалось. Любой фрагмент кода будет очень полезен, и сериализуемый объект может иметь другие ссылочные типы в качестве членов, которые могут наследоваться от другого базового класса, поэтому сериализатору могут понадобиться известные типы

Форматированный 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();
 }

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

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();
        }

    }
}
0 голосов
/ 18 октября 2019

Не против, я не передал нужный объект сериализатору, следующие работы

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();
 }
...