使用 IXmlSerialized 自定义 xml 输出

发布于 2025-01-03 05:25:07 字数 1576 浏览 1 评论 0原文

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

给定该类,

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

我只想将 Data 参数的 XML 输出包装在 标记中。

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>

是否有一种 IXmlSerialized 的简单实现,我可以在大部分情况下单独保留序列化,只包装一个成员?

编辑:这是在 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);
    }
}

What I am trying to achieve seems fairly simple.

Given the class

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

I simply want to have the XML output for the Data parameter wrapped in a <Data></Data> tag.

IE:
Desired output:

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

Actual output:

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

Is there a simple implementation of IXmlSerializable where I can leave the serialization alone for the most part and just wrap the one member?

Edit: This is in a WCF service so I don't (as far as I know) have access to the creation of the XmlSerializer.

What I ended up doing:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

丶视觉 2025-01-10 05:25:07

您可以使用 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);

You can use 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);
戒ㄋ 2025-01-10 05:25:07

架构

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>

Schema

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


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

XML Serialization

        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 Output

<?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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文