0

私は、最も外側の要素を読み取り、値を変更してから、再度保存するだけでよい、多数の大規模な記述 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>

上記を逆シリアル化し、マテリアル属性を変更してから、再度保存したいと思います。しかし、マテリアル要素 (その属性のみ) は気にしないので、それらすべてをクラスに追加する必要はありません。

現時点では以下のようにしていますが、もっと良い方法はないかと考えています。

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");
        }
    }
}
4

1 に答える 1

0

がありますXmlAnyElementAttribute。認識されていない要素をそのまま格納するようにデシリアライザーに指示します。ただし、ケースによっては、XmlReader-XmlWriter フィルターまたは XPath を使用した XmlDocument を使用した方がよい場合があります。

于 2013-01-30T00:23:08.623 に答える