我尝试使用 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 是动态的产品名称可能因名称和编号而异,也可能随时间而变化。
想法?我错过了一些明显的东西吗?
答案 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));
}
}
}