2009-07-24 24 views
7

Tôi đang sử dụng XmlTextWriter và phương pháp WriteElementString của nó, ví dụ:C#: XmlTextWriter.WriteElementString không thành công trên các chuỗi rỗng?

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

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

writer.Close(); 

Kết quả XML dự kiến ​​là:

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

Tuy nhiên, nếu ví dụ inputEmail rỗng, kết quả XML tôi nhận được như như sau:

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

Trong khi tôi mong chờ nó là:

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

Tôi đang làm gì sai? Có cách nào để đạt được kết quả mong đợi của tôi theo cách đơn giản bằng cách sử dụng XmlTextWriter không?

Trả lời

18

đầu ra của bạn là đúng. Phần tử không có nội dung phải được viết là <tag/>.

Bạn có thể buộc việc sử dụng thẻ đầy đủ bằng cách gọi WriteFullEndElement()

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

Đó sẽ ra <Email></Email> khi inputEmail trống.

Nếu bạn muốn làm điều đó nhiều hơn một lần, bạn có thể tạo ra một phương pháp khuyến nông:

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

Sau đó, mã của bạn sẽ trở thành:

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

giải pháp này không hoạt động vào cuối của tôi kỳ lạ –

+0

Tôi đã sử dụng chính xác giải pháp mà bạn đã cung cấp, và phương thức WriteFullEndElement() dường như không hoạt động ... Methinks phương pháp này bị lỗi. –

+0

Tôi tìm thấy một giải pháp thay thế trong C#. Nếu chuỗi (string.Length == 0), sau đó thay thế chuỗi rỗng bằng ký tự thoát dòng mới, tức là "\ n" –

4

Nó không thất bại <Tag/> chỉ là một phím tắt cho <Tag></Tag>

+0

Có thể ép buộc đầu ra ? –

+0

Tôi không nghĩ vậy. – RaYell

+0

Nếu đó là một vấn đề, bạn có quyền hét lên bất cứ ai yêu cầu bạn viết các thẻ ra đầy đủ; họ cần phải tuân thủ các thông số XML cơ bản. – Nyerguds

2

Mã của bạn nên là:

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

Điều này tránh rò rỉ tài nguyên trong trường hợp ngoại lệ và sử dụng đúng cách để tạo XmlReader (kể từ .NE T 2.0).

0

Để điều này ở đây trong trường hợp ai đó cần; vì không có câu trả lời nào ở trên giải quyết nó cho tôi, hoặc có vẻ như quá mức.

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

Bí quyết là để thiết lập XmlWriterSettings.Indent = true và thêm nó vào XmlWriter.

Edit:

Hoặc bạn cũng có thể sử dụng

w.Formatting = Formatting.Indented; 

thay vì thêm một XmlWriterSettings.

Các vấn đề liên quan