序列化/反序列化部分 XML 文件
本文关键字:XML 文件 反序列化部 序列化 | 更新日期: 2023-09-27 17:56:38
我正在处理许多大型描述性XML文件,我只需要读取最外层的元素,更改值,然后再次保存。
举个例子——
<Model Name="someModel">
<Material Name="someMaterial" Effect="someEffect">
<Texture Name="tex1" Path="somePath"/>
<Colour Name="colour1" Value="FFF"/>
<Layer Index="0"/>
... many more elements I don't are about
</Material>
</Model>
我想反序列化上述内容,更改材质属性,然后再次将其保存回去。但是由于我不关心材质元素(只关心它的属性),我宁愿不必将它们全部添加到类 Im 反序列化中,..但是,当我保存时,我仍然需要将它们写回去。
目前,我正在按如下方式执行此操作,但我想知道是否有更好的方法。
namespace WpfApplication9
{
public class Material
{
[XmlAttribute]
public string Name
{
get;
set;
}
[XmlAttribute]
public string Effect
{
get;
set;
}
}
public class Item
{
[XmlAttribute]
public string Name
{
get;
set;
}
public Material Material
{
get;
set;
}
public static Item Load(string _path)
{
Item item = new Item();
item.m_doc = new XmlDocument();
item.m_doc.Load(_path);
XmlNode rootNode = item.m_doc.FirstChild;
item.Name = rootNode.Attributes["Name"].InnerText;
XmlNode materialNode = rootNode.FirstChild;
item.Material = new Material();
item.Material.Name = materialNode.Attributes["Name"].InnerText;
item.Material.Effect = materialNode.Attributes["Effect"].InnerText;
return item;
}
public void Save(string _path)
{
XmlNode rootNode = m_doc.FirstChild;
rootNode.Attributes["Name"].InnerText = Name;
XmlNode materialNode = rootNode.FirstChild;
materialNode.Attributes["Name"].InnerText = Material.Name;
materialNode.Attributes["Effect"].InnerText = Material.Effect;
m_doc.Save(XmlWriter.Create(_path, new XmlWriterSettings()
{
IndentChars = "'t",
Indent = true
}));
}
XmlDocument m_doc;
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Item item = Item.Load("Data.xml");
item.Name = "Terry";
item.Save("Data.xml");
}
}
}
有XmlAnyElementAttribute
.它指示反序列化程序按原样存储无法识别的元素。但是,根据您的情况,最好使用 XmlReader-XmlWriter 筛选器或带有 XPath 的 XmlDocument 来提供服务。