2011-08-09 18 views
7

XmlWriter'i böyle bir şey yazmak için kullanmak istiyorum (hepsi bir ad alanı içinde):İsim alanlarını doğru bir şekilde işlemek için XmlWriter'i nasıl zorlayabilirim?

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

ama en yakın ben bu:

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

bu kodu kullanarak:

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

Bir önek belirtmediğimde, şunu elde ederim:

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

Çift ad alanlarında bu "hayalet" öneklerinin üretilmesi, oluşturulan belge (p3, p4, p5 vb.) boyunca gerçekleşir.

Öznitelik yazamadığımda, istediğim çıktıyı alırım (özniteliklerin eksik olması dışında).

Neden XmlWriter istemediğim gibi yinelenen ad alanlarını ihmal etmiyor?

cevap

4

böyle deneyin:

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

Teşekkür! Bu özellik tamamen karşı sezgisel de olsa çalışır, çünkü özniteliklerin ad alanları vardır. – lesscode

+0

Ya da [SO] (http://stackoverflow.com/questions/2500111/how-do-i-add-a-default-namespace-with-no-prefix-using-xmlserializer) sorusuna Darin yanıtını kullanın. – SteveC

+0

daha iyi bir çözüm buldunuz? Bu ns yönetiminin otomatik olması gerekiyordu sanırım! :(Burada özellikle son örneği seviyorum: http://msdn.microsoft.com/en-us/library/d1a1csew%28v=vs.80%29.aspx – Fowl

İlgili konular