我正在处理许多大型描述性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>
我想反序列化上面的内容,更改一个Material属性,然后再将其保存回来。但由于我不关心材质元素(只是它的属性),我宁愿不必将它们全部添加到类中我也要反序列化..但是,我需要它们在我保存时仍然会被写回来。
目前,我这样做的情况如下,但我想知道是否有更好的方法。
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");
}
}
}
答案 0 :(得分:0)
有XmlAnyElementAttribute
。它指示反序列化器按原样存储未识别的元素。但是,根据您的情况,使用XmlReader-XmlWriter过滤器或带有XPath的XmlDocument可能会更好。