从我的 XML 获取信息

本文关键字:信息 获取 XML 我的 | 更新日期: 2023-09-27 18:32:53

我对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文件并从中获取我想要的信息(例如"标题")。

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

从我的 XML 获取信息

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

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

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

如果输出是你所期望的,我认为你不应该改变任何东西。

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

它们的作用是获得对序列化的完全控制并避免意外行为

如果你不想担心序列化的细节,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);
    }
}

这实际上应该只与引用类型一起使用(对象,而不是基元类型或结构)。 Deserialize可以返回 null,将其强制转换为值类型只会带来心痛。