从我的 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/对象架构进行更改,并编写适当的迁移函数来处理将来所做的任何更改。
而是使用 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,将其强制转换为值类型只会带来心痛。