2017-12-10 23 views
1

私はこのようになり、「XML」ファイルを持っている:オブジェクトのリストの上にSerializeメソッドを使用して作成され複数のルートを持つC#でXMLを逆シリアル化する方法

<root> 
<a> 
    <b> 
    </b> 
</a> 
</root> 
<root> 
<a> 
    <b> 
    </b> 
</a> 
</root> 
<root> 
<a> 
    <b> 
    </b> 
</a> 
</root> 
.... 

。だから私はそれを逆シリアル化するための一致するクラスがあります。

今私はデシリアライズしようとすると、私は複数の根のエラーを取得します。 このファイルをオブジェクトのリストに再度逆シリアル化する方法はありますか?

私の考えの1つは、リストされたクラスの周りに別のクラスをラップし、それを "rootclass"のようなものと呼び、これだけを直列化することです。これは単一のルートにつながります。しかし、指定されたXMLファイルだけでそれを行うanotehrの方法はありますか?

私の直列化復元は、次のようになります。

static public List<CT> DeSerialize(string FileName) 
    { 
     XmlSerializer deserializer = new XmlSerializer(typeof(List<CT>), new XmlRootAttribute("root")); 
     List<CT> result; 

     using (FileStream fileStream = new FileStream(@FileName, FileMode.Open)) 
     { 
      result = (List<CT>)deserializer.Deserialize(fileStream); 
     } 

     return result; 
    } 
+2

'一覧'と 'Array'は、独自のルートオブジェクトを作成するときに、シリアライズ。 List/Arrayオブジェクトをシリアライザに渡すのはなぜですか? – dotNET

+0

https://stackoverflow.com/questions/134494/is-there-any-difference-between-valid-xml-and-well-formed-xml/この投稿から恩恵を受ける可能性があります。 – FakeCaleb

+0

プログラムの寿命中に新しい要素をファイルに保存します。だから私は本当に本当のルート要素を望んでいません – Hunselfunsel

答えて

0

あなたは断片がそうフラグメントに設定されている設定としたXmlReaderを使用してい:

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) 
     { 
      XmlReaderSettings settings = new XmlReaderSettings(); 
      settings.ConformanceLevel = ConformanceLevel.Fragment; 
      XmlReader reader = XmlReader.Create(FILENAME,settings); 


      while (!reader.EOF) 
      { 
       if (reader.Name != "root") 
       { 
        reader.ReadToFollowing("root"); 
       } 
       if (!reader.EOF) 
       { 
        XElement root = (XElement)XElement.ReadFrom(reader); 
       } 
      } 
     } 
    } 
} 
関連する問題