簡體   English   中英

如何在指定的XML節點之間對對象進行序列化/反序列化?

[英]How To Serialize/Deserialize An Object To/From A Specified XML Node?

我正在嘗試使用XmlSerializerXmlWriter / 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結構相同。

我可以手動描述ThisSettingThatSetting 它們不是對象定義的一部分。 我需要處理的情況下該文件不存在最初,或者如果只有,比如說,一個ThatSetting當我去保存ThisSetting(該文件是無關緊要的順序),所以要加節點的能力需要。 (我想我可以簡單地有多個文件,但這似乎很不整潔。)

任何人都可以提供一種簡單而干凈的方法嗎? 顯然,我可以手動解析該文件以進行讀寫,但這似乎沒有必要。 我可以包裝該對象以提供ThisSettingThatSetting作為封閉屬性,但是ThisSettingThatSetting根據產品名稱是動態的,名稱可能會隨名稱和數字的變化而變化。

有想法嗎? 我錯過了明顯的事情嗎?

使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM