【问题标题】:Customizing xml output with IXmlSerializable使用 IXmlSerializable 自定义 xml 输出
【发布时间】:2012-02-08 00:37:03
【问题描述】:

我想要实现的目标似乎相当简单。

给定班级

public class Wrapper<T> { 
   T Data { get; set; }
   bool Success { get;set; }
   List<Error> Errors { get; set; }
}

我只想将 Data 参数的 XML 输出包装在 &lt;Data&gt;&lt;/Data&gt; 标记中。

IE: 期望的输出:

<Wrapper>
    <Data>
       <Person first="Bob" last="Robertson"/>
    </Data>
   <Errors/>
    <Success>true</Success>
</Wrapper

实际输出:

<Wrapper>
    <Person first="Bob" last="Robertson"/>
    <Errors/>
    <Success>true</Success>
</Wrapper>

是否有一个简单的 IXmlSerializable 实现,我可以在其中大部分时间不用序列化,只包装一个成员?

编辑:这是在 WCF 服务中,所以我(据我所知)无法访问 XmlSerializer 的创建。

我最终做了什么:

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        writer.WriteElementString("Success", Success.ToString());
        writer.WriteStartElement("Errors");

        foreach (var error in Errors)
        {
            Util.XmlSerialize(error, writer);
        }

        writer.WriteStartElement("Data");
        Util.XmlSerialize(this.Data, writer);
        writer.WriteEndElement();
    }

-

public class Util
{
    public static void XmlSerialize<T>(T obj, XmlWriter writer)
    {
        var nsSerializer = new XmlSerializerNamespaces();
        nsSerializer.Add("", "");

        var ser = new XmlSerializer(typeof (T));
        ser.Serialize(writer, obj, nsSerializer);
    }
}

【问题讨论】:

  • @onof:我尝试了很多东西,但感觉我正在重新实现 XmlSerializer(例如,尊重注释等)。认为可能有一种我忽略的简单方法。我还尝试重组我的代码以更好地匹配我想要的格式,但这看起来真的很臭。

标签: c# wcf xml-serialization


【解决方案1】:

您可以使用 XmlOverrides:

var xmlOverrides = new XmlAttributeOverrides();
var attributes = new XmlAttributes();
attributes.XmlElements
     .Add(new XmlElementAttribute("Person", typeof (Person)));
xmlOverrides.Add(typeof(Wrapper<Person>), "Data", attributes);

var serializer = new XmlSerializer(typeof(Wrapper<ExampleObject>), xmlOverrides);

【讨论】:

  • 这是曲线球:这是在 WCF 中,我在服务合同中指定 [XmlSerializerFormat],因此我不负责创建 XmlSerializer。
【解决方案2】:

架构

public class Wrapper<T>
{
    public T Data { get; set; }
    public bool Success { get; set; }
}


public class Person
{
    public string first;
    public string last;
}

XML 序列化

        Wrapper<Person> f = new Wrapper<Person>();
        f.Data = new Person();
        f.Data.first = "Bob";
        f.Data.last = "Robertson";
        XmlSerializer SerializerObj = new XmlSerializer(typeof(Wrapper<Person>));
        TextWriter WriteFileStream = new StreamWriter(@"C:\test.xml");
        SerializerObj.Serialize(WriteFileStream, f);
        WriteFileStream.Close();

XML 输出

<?xml version="1.0" encoding="utf-8"?>
<WrapperOfPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Data>
    <first>Bob</first>
    <last>Robertson</last>
  </Data>
  <Success>false</Success>
</WrapperOfPerson>

【讨论】:

  • 这就是我目前所拥有的。我要找的是&lt;Data&gt;&lt;Person&gt;&lt;first&gt;Bob&lt;/first&gt;&lt;last&gt;Robertson&lt;/last&gt;&lt;/Person&gt;&lt;/Data&gt;
  • 只能获取数据标签或人物标签。
猜你喜欢
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 2016-09-08
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多