如何将对象序列化/反序列化到指定的XML节点?

时间:2017-11-18 21:33:49

标签: c# xml serialization

我尝试使用 XmlSerializer XmlWriter / XMLReader 在XML设置文件中序列化对象。

在最简单的形式中,这是相当微不足道的:

XmlSerializer oSerializer = new XmlSerializer(typeof(mySettings), new XmlRootAttribute("Settings"));
    using (XmlWriter oXmlWriter = XmlWriter.Create(myFilePath) 
        oSerializer.Serialize(oXmlWriter, mySettings);

XmlSerializer oSerializer = new XmlSerializer(typeof(mySettings), new XmlRootAttribute("Settings"));
    using (XmlReader oXmlReader = XmlReader.Create(myFilePath)
        oSerializer.Serialize(oXmlWriter, mySettings);

生成和读取(简化示例):

<?xml version="1.0" encoding="utf-8"?>
<Settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Token>NC05MWY4NmJkOGRl</Token>
  <TokenExpiry>2017-11-01</TokenExpiry>
  <TokenType>bearer</TokenType>
</Settings>

但是,我正在尝试在不同的节点中保存(并读取)不同版本的(相同)对象,例如:

<?xml version="1.0" encoding="utf-8"?>
<Settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ThisSetting>
    <Token>NC05MWY4NmJkOGRl</Token>
    <TokenExpiry>2017-11-01</TokenExpiry>
    <TokenType>bearer</TokenType>
  </ThisSetting>
  <ThatSetting>
    <Token>eyJ0eXAiOiJKV1Qi</Token>
    <TokenExpiry>2017-11-05</TokenExpiry>
    <TokenType>token</TokenType>
  </ThatSetting>
</Settings>

注意:在编写同一类对象时,节点之间的XML结构是相同的。

我可以手动描述 ThisSetting ThatSetting ;它们不是对象定义的一部分。我需要处理文件最初不存在的情况,或者当我去保存 ThisSetting 时,如果只有,例如, ThatSetting 文件中的顺序无关紧要),因此需要添加节点的能力。 (我想,我可以简单地拥有多个文件,但这看起来非常不整洁。)

任何人都可以提供一种简单而干净的方式吗?显然,我可以手动解析文件以进行写入和阅读,但这似乎不应该是必要的。我可以将对象包装为提供 ThisSetting ThatSetting 作为封闭属性,但 ThisSetting ThatSetting 是动态的产品名称可能因名称和编号而异,也可能随时间而变化。

想法?我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:0)

使用xml linq很容易:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;


namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            XElement settings = doc.Root;

            List<XElement> children = settings.Elements().ToList();

            settings.Descendants().Remove();

            settings.Add(new XElement("ThisSettings", children));
        }
    }
}