从我的XML获取信息

时间:2014-12-02 14:59:05

标签: c# xml

我是XML序列化/反序列化的新手,我想知道我应该如何将标记(XmlElement,XmlAttribute等)应用于我正在写入XML文件的以下对象,以使它对我来说最合适。以后使用LINQ或类似的方法来获取我想要的数据。让我举个例子:

    [XmlRoot("Root")]
    public class RootObject
    {
        public Services Services { get; set; }
    }

    public class Services
    {
        public Service TileMapService { get; set; }
    }

    public class Service
    {
        public string Title { get; set; }
        public string href { get; set; }
    }

在这里,我已经定义了一些属性,我将用XML编写一些属性,稍后我将添加这些属性。此时,我已经对此方法中的值进行了硬编码:

public static void RootCapabilities()
    {
        RootObject ro = new RootObject()
        {
            Services = new Services()
            {
                TileMapService = new Service()
                {
                    Title = "Title",
                    href = "http://something"
                }
            }
        };

这让我得到了这个XML输出:

<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Services>
    <TileMapService>
      <Title>Title</Title>
      <href>http://something</href>
    </TileMapService>
  </Services>
</Root>

我的问题是,如果这是一种有效的方法,或者我必须使用'XmlElement'和'XmlAttribute'标签以后来反序列化这个XML文件并从中获取信息,我想要的(例如) '标题')。

我还不确定如何写这个问题,所以如果它太模糊,请告诉我。

3 个答案:

答案 0 :(得分:1)

如果我是你,我不会使用XML序列化。对模式/对象结构的任何更改都会因XML序列化作为一种​​技术而立即失去向后兼容性。

而是将XML序列化与实际的类结构分开 - 这样您就可以对XML /对象模式进行更改并编写适当的迁移函数来处理您将来所做的任何更改。

而是使用LINQ-to-XML类来构造XML文档并将其保存,因为它们是.NET中以分离方式将对象结构转换为XML的最简单方法。

答案 1 :(得分:1)

如果输出符合您的预期,我认为您不应该做任何改变。

当您想要更改默认行为时,您应该使用XmlAttributeXmlIgnore等装饰器(例如,不要包含字段,包含一个字段作为属性...)

他们的角色是完全控制序列化并避免意外行为

答案 2 :(得分:1)

如果您不想担心序列化的细节,XmlSerializer总是对我很好。

public static void SerializeObject(T obj, string file)
{
    XmlSerializer s = new XmlSerializer(typeof(T));
    TextWriter w = new StreamWriter(file);
    s.Serialize(w, obj);
    w.Close();
}

public static T DeserializeObject(string file)
{
    XmlSerializer s = new XmlSerializer(typeof(T));
    using (StreamReader r = new StreamReader(file))
    {
        return (T)s.Deserialize(r);
    }
}

这应该只用于引用类型(对象,而不是基本类型或结构)。 <{1}}可以返回null并将其转换为值类型只会带来心痛。