![](/img/trans.png)
[英]How to serialize/deserialize an object matrix to/from xml in C#?
[英]How To Serialize/Deserialize An Object To/From A Specified XML Node?
我正在嘗試使用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 ; 它們不是對象定義的一部分。 我需要處理的情況下該文件不存在最初,或者如果只有,比如說,一個ThatSetting當我去保存ThisSetting(該文件是無關緊要的順序),所以要加節點的能力需要。 (我想我可以簡單地有多個文件,但這似乎很不整潔。)
任何人都可以提供一種簡單而干凈的方法嗎? 顯然,我可以手動解析該文件以進行讀寫,但這似乎沒有必要。 我可以包裝該對象以提供ThisSetting和ThatSetting作為封閉屬性,但是ThisSetting和ThatSetting根據產品名稱是動態的,名稱可能會隨名稱和數字的變化而變化。
有想法嗎? 我錯過了明顯的事情嗎?
使用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));
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.