2011-08-09 25 views
7

Tôi muốn sử dụng XmlWriter để viết một cái gì đó như thế này (tất cả trong một namespace):Làm thế nào tôi có thể ép buộc XmlWriter để xử lý không gian tên chính xác?

<Root xmlns="http://tempuri.org/nsA"> 
    <Child attr="val" /> 
</Root> 

nhưng gần nhất tôi có thể dường như nhận được là thế này:

<p:Root xmlns:p="http://tempuri.org/nsA"> 
    <p:Child p:attr="val" /> 
</p:Root> 

sử dụng mã này:

using System; 
using System.Text; 
using System.Xml; 

namespace ConsoleApplication1 
{ 
    internal class Program 
    { 
     private const string ns = "http://tempuri.org/nsA"; 
     private const string pre = "p"; 

     private static void Main(string[] args) 
     { 
      var sb = new StringBuilder(); 
      var settings = new XmlWriterSettings 
        { 
         NamespaceHandling = NamespaceHandling.OmitDuplicates, 
              /* ineffective */    
         Indent = true 
        }; 
      using (XmlWriter writer = XmlWriter.Create(sb, settings)) 
      { 
       writer.WriteStartElement(pre, "Root", ns); 
       writer.WriteStartElement(pre, "Child", ns); 
       writer.WriteAttributeString(pre, "attr", ns, "val"); 
              // breaks namespaces  
       writer.WriteEndElement(); 
       writer.WriteEndElement(); 
      } 
      Console.WriteLine(sb.ToString()); 
     } 
    } 
} 

Khi tôi không chỉ định tiền tố, tôi nhận được:

<Root xmlns="http://tempuri.org/nsA"> 
    <Child p2:attr="val" xmlns:p2="http://tempuri.org/nsA" /> 
</Root> 

Việc tạo các tiền tố "phantom" này trong các không gian tên trùng lặp xảy ra trong suốt tài liệu được tạo (p3, p4, p5, v.v ...).

Khi tôi không viết thuộc tính, tôi nhận được kết quả mong muốn (ngoại trừ nó thiếu thuộc tính, rõ ràng).

Tại sao không phải là XmlWriter bỏ qua các không gian tên trùng lặp như tôi đã hỏi?

Trả lời

4

Hãy thử như thế này:

using System; 
using System.Text; 
using System.Xml; 

class Program 
{ 
    private const string ns = "http://tempuri.org/nsA"; 

    static void Main() 
    { 
     var settings = new XmlWriterSettings 
     { 
      Indent = true 
     }; 
     using (var writer = XmlWriter.Create(Console.Out, settings)) 
     { 
      writer.WriteStartElement("Root", ns); 
      writer.WriteStartElement("Child"); 
      writer.WriteAttributeString("attr", "", "val"); 
      writer.WriteEndElement(); 
      writer.WriteEndElement(); 
     } 
    } 
} 
+1

Cảm ơn! Điều đó hoạt động, mặc dù hoàn toàn phản trực giác, vì các thuộc tính cũng có các không gian tên. – lesscode

+0

Hoặc sử dụng Darin trả lời cho câu hỏi [SO] (http://stackoverflow.com/questions/2500111/how-do-i-add-a-default-namespace-with-no-prefix-using-xmlserializer) – SteveC

+0

Bất cứ ai tìm thấy một giải pháp tốt hơn? Điều này quản lý ns là giả sử được cho là tự động! :(Tôi đặc biệt thích ví dụ cuối cùng ở đây: http://msdn.microsoft.com/en-us/library/d1a1csew%28v=vs.80%29.aspx – Fowl

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