2009-07-24 98 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來實現我的預期結果?

回答

18

你的輸出是正確的一條捷徑。沒有內容的元素應寫爲<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(); 
4

它不會失敗<Tag/>僅僅是<Tag></Tag>

+0

有可能強制它輸出? – 2009-07-24 07:24:32

+0

我不這麼認爲。 – RaYell 2009-07-24 07:35:41

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

編輯:

另外,您還可以使用

w.Formatting = Formatting.Indented; 

,而不是添加XmlWriterSettings。