2009-07-24 34 views
7

私は例えば、XmlTextWriterとそのWriteElementStringメソッドを使用しています:C#: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/>を失敗しない

答えて

18

あなたの出力が正しいことのためだけのショートカットです。内容のない要素は、<tag/>と記述する必要があります。

あなたは()

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

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(); 
+0

このソリューションは私の最後では不思議に機能しません –

+0

あなたが提供した全く同じソリューションを使用しましたが、WriteFullEndElement()メソッドが動作していないようです...このメソッドは誤りです。 –

+0

C#の回避策を見つけました。 (string.Length == 0)の場合は、空の文字列を改行文字で置き換えます。つまり、 "\ n" –

4

<Tag></Tag>

+0

出力するように強制できます。? –

+0

私はそうは思わない。 – RaYell

+0

それが問題であれば、あなたは誰でもあなたがタグを完全に書き出すことを要求する人に怒鳴ることができます。彼らは基本的なXML仕様に従う必要があります。 – Nyerguds

2

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

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

これにより、例外の場合のリソースリークを回避し、適切な方法でXmlReaderを作成します(.NE以降T 2.0)。

0

誰かが必要な場合に備えてここに残してください。上記の答えのどれも私のためにそれを解決しなかったので、または過度のように思えた。

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に追加しました。

編集:

代わりに、あなたはまた、代わりにXmlWriterSettingsを追加するので

w.Formatting = Formatting.Indented; 

を使用することができます。

関連する問題