【问题标题】:Flattening Serialized XML in C#在 C# 中展平序列化 XML
【发布时间】:2012-11-30 11:06:34
【问题描述】:

如果我有一个对象:-

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# 类结构?

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

【问题讨论】:

    标签: c# serialization


    【解决方案1】:

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

    或者,您也可以使用attributes that control XML serialisation 来装饰您的类和属性。

    【讨论】:

    • 现在设法解决了,摆脱 a b 的解决方案是使用 [XmlElement("b"]。所以对于开始的代码,我这样做class c { [XmlElement("b")] List<b> b; }
    【解决方案2】:

    如果这是你想要的:

    <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 serialization, collection and root element

    【讨论】:

    • 添加了如此链接,以及一些额外的想法
    猜你喜欢
    • 2010-11-25
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    相关资源
    最近更新 更多