繁体   English   中英

具有并排元素的 C# XML 序列化

[英]C# XML Serialization having elements side-by-side

我目前正在尝试理解使用 C# 将对象序列化为 XML 的概念。 我已经到了一切正常的地步,但现在我得到了以这样一种方式格式化 XML 输出文件的任务,其中元素并排而不是彼此下方。 例如:

这就是它需要的样子

<House>
  <Address>
    <Street>Some Street</Street><HouseNo>123</HouseNo><State>Texas</State>
  </Address>
<House>

但我只设法让它看起来像这样:

<House>
  <Address>
    <Street>Some Street</Street>
    <HouseNo>123</HouseNo>
    <State>Texas</State>
  </Address>
</House>

有什么方法可以按照我在第一个示例中描述的方式格式化输出吗? 任何帮助将非常感激。

我已经尝试更改一些XmlWriterSettings ,例如IndentNewLineHandling ,但到目前为止都没有用。 我还尝试阅读 XmlSerializer 代码以尝试了解正在发生的事情或在哪里进行更改以获得我想要的结果,但这似乎并不顺利。

您可以创建一个带有自定义序列化的地址类,这是一个完整的工作示例

using System;
using System.Diagnostics;
using System.IO;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Schema;
using System.Xml.Serialization;
                    
public class Program
{
    public static void Main()
    {
        var houseBefore = new House
        {
            Address = new FlatAddress
                              {
                                 Street = "SomeStreet",
                                 HouseNo = "123",
                                 State = "Texas"
                              }
        };
        
        var serializer = new XmlSerializer(typeof(House));
        string xml;
        using (var writer = new StringWriter())
        {
            serializer.Serialize(writer, houseBefore);
            xml = writer.ToString();
        }
        
        Console.WriteLine(xml);
        
        House houseAfter;
        using (var reader = new StringReader(xml))
        {
            houseAfter = serializer.Deserialize(reader) as House;
        }
        
        Debug.Assert(houseBefore.Address.Street == houseAfter.Address.Street);
        Debug.Assert(houseBefore.Address.HouseNo == houseAfter.Address.HouseNo);
        Debug.Assert(houseBefore.Address.State == houseAfter.Address.State);
    }
}

public sealed class House
{
    public FlatAddress Address { get; set; }
}

public sealed class FlatAddress : IXmlSerializable
{
    public string Street { set; get; }
    public string HouseNo { set; get; }
    public string State { set; get; }
    
    public XmlSchema GetSchema()
    {
        return default;
    }
    
    public void ReadXml(XmlReader reader)
    {
        while (reader.Read())
        {
            if (reader.NodeType == XmlNodeType.Element)
            {
                switch (reader.Name)
                {
                    case nameof(Street):
                        this.Street = reader.ReadElementContentAsString();
                        break;

                    case nameof(HouseNo):
                        this.HouseNo = reader.ReadElementContentAsString();
                        break;

                    case nameof(State):
                        this.State = reader.ReadElementContentAsString();
                        break;
                }
            }
        }
    }
    
    public void WriteXml(XmlWriter writer)
    {
        writer.WriteElementString(nameof(Street), this.Street);
        var houseNoXml = new XElement(nameof(HouseNo), this.HouseNo);
        writer.WriteRaw(houseNoXml.ToString());
        var stateXml = new XElement(nameof(State), this.State);
        writer.WriteRaw(stateXml.ToString());
        
        if (writer.Settings.NewLineHandling == NewLineHandling.Replace)
        {
            writer.WriteRaw(writer.Settings.NewLineChars);
        }
        
        if (writer.Settings.Indent)
        {
            writer.WriteRaw(writer.Settings.IndentChars);
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM