質問

私は、たとえば、XmlTextWriterとそのWriteElementStringメソッドを使用しています:

XmlTextWriter writer = new XmlTextWriter("filename.xml", null);

writer.WriteStartElement("User");
writer.WriteElementString("Username", inputUserName);
writer.WriteElementString("Email", inputEmail);
writer.WriteEndElement();

writer.Close();

期待されるXML出力は次のとおりです。

<User>
    <Username>value</Username>
    <Email>value</Email>
</User>
例えばinputEmailが空の場合は、以下のように

しかし、結果のXMLは、私が入手ます:

<User>
    <Username>value</Username>
    <Email/>
</User>

私はそれがあることを期待する一方ます:

<User>
    <Username>value</Username>
    <Email></Email>
</User>

私が間違って何をしているのですか? XmlTextWriterを使用して簡単な方法で、私の期待される結果を達成するための方法はありますか?

役に立ちましたか?

解決

あなたの出力は正しいです。コンテンツのない要素は<tag/>のように記述する必要があります。

あなたはWriteFullEndElementを呼び出すことにより、完全なタグの使用を強制することができます()

writer.WriteStartElement("Email");
writer.WriteString(inputEmail);
writer.WriteFullEndElement();

その意志出力<Email></Email>をinputEmailは空です。

あなたは何度もその多くを行いたい場合は、あなたが拡張メソッドを作成することができます:

public static void WriteFullElementString(this XmlTextWriter writer,
                                          string localName, 
                                          string value)
{
    writer.WriteStartElement(localName);
    writer.WriteString(value);
    writer.WriteFullEndElement();
}

次に、あなたのコードはなるます:

writer.WriteStartElement("User");
writer.WriteFullElementString("Username", inputUserName);
writer.WriteFullElementString("Email", inputEmail);
writer.WriteEndElement();

他のヒント

これは<Tag/>に失敗しません。

<Tag></Tag>のためだけのショートカットです

あなたのコードは次のようになります。

using (XmlWriter writer = XmlWriter.Create("filename.xml"))
{
    writer.WriteStartElement("User");
    writer.WriteElementString("Username", inputUserName);
    writer.WriteElementString("Email", inputEmail);
    writer.WriteEndElement();
}

これは、例外の場合にリソースリークを回避し、そして(.NET 2.0以降)のXmlReaderを作成するための適切な方法を使用します。

誰かがそれを必要とする場合に、ここにこれを残します。上記の答えのどれも私のためにそれを解決していない、あるいはやり過ぎのように思えたからです。

FileStream fs = new FileStream("file.xml", FileMode.Create);

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;

XmlWriter w = XmlWriter.Create(fs, settings);
w.WriteStartDocument();
w.WriteStartElement("tag1");
w.WriteStartElement("tag2");
w.WriteAttributeString("attr1", "val1");
w.WriteAttributeString("attr2", "val2");
w.WriteFullEndElement();
w.WriteEndElement();
w.WriteEndDocument();

w.Flush();
fs.Close();

トリックの のXmlWriterSettings.Indent =真を設定しての のたXmlWriter のに追加しました。

の編集:

別の方法として使用することもできます。

w.Formatting = Formatting.Indented;

の代わりにXmlWriterSettingsを加える。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top