|
分類:[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();
}
|