序列化/反序列化部分 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");
        }
    }
}

序列化/反序列化部分 XML 文件

XmlAnyElementAttribute .它指示反序列化程序按原样存储无法识别的元素。但是,根据您的情况,最好使用 XmlReader-XmlWriter 筛选器或带有 XPath 的 XmlDocument 来提供服务。