C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 35 を表示中)
■17389 / )  2つのList<>のシリアライズについて
□投稿者/ SAD (9回)-(2008/04/23(Wed) 12:25:17)

分類:[C++/CLI] 

2005 C++/CLI

2つのDictionaryを1つのXMLファイルに出力させたく、以下のようなものを作りました。
DicA、DicBには既に値がセットされているものとしてこれを実行すると、
//× 
という所で例外System.InvalidOperationExceptionが発生します。

「追加情報: 状態 EndRootElement のトークン StartElement は
XML ドキュメントを無効にする可能性があります。
XML フラグメントを書き込む場合は、ConformanceLevel の設定が
ConformanceLevel.Fragment または ConformanceLevel.Auto
になっていることを確認してください。 」

ということでしたので、
//        st->ConformanceLevel = System::Xml::ConformanceLevel::Auto;
を有効にして実行したところ、どうにかファイルに出力することはできました。

なぜ上記の1行を追加しなければならないのかがわかりません。
Autoにすると、宣言「<?xml version="1.0" encoding="utf-8"?>」が出力されなくなります。
AutoではなくDocumentとして出力させるにはどのようにすればよいのでしょうか?

public ref class Entry
{
public:
    Object^ Key;
    Object^ Value;
    Entry()
    {
    }
    Entry(Object^ key, Object^ value)
    {
        this->Key = key;
        this->Value = value;
    }
};

public ref class TestClass
{
public:
    Dictionary<int , String^>^ DicA;
    Dictionary<int , String^>^ DicB;

public:
    void Test()
    {
        XmlWriterSettings^ st = gcnew XmlWriterSettings();
        st->Encoding = System::Text::Encoding::UTF8;
        st->Indent = true;
//        st->ConformanceLevel = System::Xml::ConformanceLevel::Auto;

        XmlWriter^ xw = XmlWriter::Create(L"C:\\test.xml", st);
        XmlSerializer^ sr1 = gcnew XmlSerializer(List<Entry^>::typeid);

        List<Entry^>^ entries1 = gcnew List<Entry^>();

        xw->WriteStartElement("AAA");
        this->DicToEnt(entries1, this->DicA);	//DicAをentries1にコピー
        sr1->Serialize(xw, entries1);
        xw->WriteEndElement();

        xw->Flush();
        entries1->Clear();

        xw->WriteStartElement("BBB");			//×
        this->DicToEnt(entries1, this->DicB);	//DicBをentries1にコピー
        sr1->Serialize(xw, entries1);
        xw->WriteEndElement();

        xw->Close();
    }

返信 編集キー/


管理者用

- Child Tree -