2

如果我有一个对象:-

class c { List<b> b; }

class b { string a; }

当 c 转换为 XML 时,结果是:-

<c> <b> <b> <a>Hello</a> </b>...

有什么方法可以通过代码结构或选项来展平 XML,以便我可以摆脱其中的一层?我最终希望 XML 只是:-

<c> <b> <a>Hello</a> </b>....

或者另一种看待问题的方式,如何反序列化:-

<c><b><a>Name</a></b><b><a>Age</a></b></c>

到 C# 类结构?

提前致谢?如果不可能,请告诉我。

4

2 回答 2

0

一种选择是实现IXmlSerializable以完全控制您的类的 XML 序列化应该采用什么形式。

或者,您可以使用控制 XML 序列化的属性来装饰您的类和属性。

于 2012-11-30T11:12:15.430 回答
-1

如果这是你想要的:

<ArrayOfB>
     <b>
          <a>Name</a>
     </b>
     <b>
          <a>Age</a>
     </b>
</ArrayOfB>

那么这应该工作。

public class XMLPlayground
{
    public void Play()
    {
        List<b> list = new List<b>()
        {    
            new b() {a = "Name"}, 
            new b() {a = "Age"}, 
        };
        string str = SerializeToString(list);
        Console.WriteLine(str); 
    }

    private string SerializeToString(object o)
    {
        if (o == null) return "";
        var xs = new XmlSerializer(o.GetType());

        XmlSerializerNamespaces tellTheSeriliserToIgnoreNameSpaces = new XmlSerializerNamespaces();
        tellTheSeriliserToIgnoreNameSpaces.Add(String.Empty, String.Empty);
        XmlWriterSettings tellTheWriterToOmitTheXmlDeclaration = new XmlWriterSettings { OmitXmlDeclaration = true };

        using (StringWriter writer = new StringWriter())
        {
            using (var xw = XmlWriter.Create(writer, tellTheWriterToOmitTheXmlDeclaration))
            {
                xs.Serialize(xw, o, tellTheSeriliserToIgnoreNameSpaces);
                return writer.ToString();
            }
        }
    }
}

[Serializable]
public class b
{
    public string a { get; set; }
}

这是您想要实现的目标的一些见解,但对我来说,解决方案看起来相当深奥。您可能想尝试使用 XmlTextReader 的 SAX 方法并即时构建您的对象。

C# Xml序列化、集合和根元素

于 2012-11-30T11:24:39.430 回答