0

作成中の Windows フォーム アプリケーションがあり、xml ファイルを作成してデータを追加したいと考えています。

コードは以下のとおりです。

 xmlFile = new XDocument(
                    new XDeclaration("1.0", "utf-8", "yes"),
                    new XComment("XML File for storing " + RootName));
xmlFile.Add(new XElement(RootName));

// Loop through the list and create a new element for each item in the list
foreach (Contact c in contactsList)
{
    try
    {
        xmlFile.Add(new XElement("Contact",
            new XElement("Name", c.Name),
            new XElement("Email", c.EmailAddress),
            new XElement("Mobile Number", c.MobileNumber),
            new XElement("Mobile Carrier", c.sMobileCarrier)
            )
        );
    }
    catch
    {
        MessageBox.Show("ERROR WITH NEW ELEMENTS");
    }
}
xmlFile.Save(FileName);

プログラムを実行すると、try ブロックがスローされてエラーが発生し、メッセージ ボックス エラーが表示されます。デバッグすると、プログラムは例外が次のものに関係していると言います:

The ' ' character, hexadecimal value 0x20, cannot be included in a name.

渡されたすべての値とエントリのポイントまでを確認したため、これが何を意味するのかわかりません。

xmlFile.Add()ステートメントにパラメーターがありませんか?

最後の質問です。XDocument オブジェクトを作成した後に Root 要素を挿入すると、ファイルに として出力されます<Contacts />。これを終了ルート タグにしたいと考えています。

開始タグを挿入し、最後に保存するときに終了タグを追加するにはどうすればよいですか?

ありがとう

更新--------------------- MarcinJuraszek のおかげで、スローされた例外を回避できましたが、次のエラーが発生しました。

This operation would create an incorrectly structured document.

それが何を意味するのか、何が原因なのか、何か考えはありますか?

4

1 に答える 1

2

エラー メッセージは明確です: XML 要素名にスペースを含めることはできません。あなたはまさにそれをやろうとしています:

        new XElement("Mobile Number", c.MobileNumber),
        new XElement("Mobile Carrier", c.sMobileCarrier)

これらの行にスペースが含まれないように変更すると、機能するはずです。例えば

        new XElement("MobileNumber", c.MobileNumber),
        new XElement("MobileCarrier", c.sMobileCarrier)

開始タグを挿入し、最後に保存するときに終了タグを追加するにはどうすればよいですか?

タグの開始/終了について心配する必要はありません。XElement.Saveメソッドがそれを処理します。

アップデート

ここでの 2 番目の問題は、複数のルート要素を持つドキュメントを作成しようとしているという事実です。これは、新しいコンテンツをルートに追加する代わりに、インスタンスXElementに直接追加しようとしているためです。XDocument

以下を試してください:

    xmlFile.Root.Add(new XElement("Contact",
        new XElement("Name", c.Name),
        new XElement("Email", c.EmailAddress),
        new XElement("MobileNumber", c.MobileNumber),
        new XElement("MobileCarrier", c.sMobileCarrier)
        )
于 2013-10-16T18:51:29.477 に答える