2010-05-14 9 views
6

Ben tüm unsurları böyle, öneki ile bir XML dosyası oluşturmak zorunda:XmlSerializer Üretim XML No Ad Alanı Önek

<ps:Request num="123" xmlns:ps="www.ladieda.com"> 
    <ps:ClientId>5566</ps:ClientId> 
<ps:Request> 

benim nesne seri, C# akıllı ve yapar:

<Request num="123" xmlns="www.ladieda.com"> 
    <ClientId>5566</ClientId> 
<Request> 

Bu iyi, çünkü ps: gerekli değil.

Ancak, tüm önekleri serileştirmek için C#'yi zorlamanın bir yolu var mı? senin dize tüketici XML işleme olsaydı o değil çünkü her şeyden

String XmlizedString = null; 
MemoryStream memoryStream = new MemoryStream(); 
XmlSerializer xs = new XmlSerializer(pObject.GetType()); 
XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); 

xs.Serialize(xmlTextWriter, pObject); 
memoryStream = (MemoryStream)xmlTextWriter.BaseStream; 
XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray()); 
return XmlizedString; 


private String UTF8ByteArrayToString(Byte[] characters) 
{ 
    UTF8Encoding encoding = new UTF8Encoding(); 
    String constructedString = encoding.GetString(characters); 
    return (constructedString); 
} 
+0

BTW, sizin ad unutmadan değil. Ad alanınız doğru şekilde serileştirildi. Kullanmak için bir önek söylemediğinden, sadece bir önek kullanmıyor, bu da mantıklı. –

cevap

15

Birinci, o zaman, öneki umurumda olmaz:

Benim serialize kod (gelen nesne pObject için) 'dir önemli değil (XML'e). Belki de XML'i anlamıyorlar ve bir dizgeyi işlediklerini sanıyorlar (her öğede "ps:" dizesinin bulunması gerekebilir). kaldırılmış XmlTextWriter sınıfını kullanarak

XmlSerializer xs = new XmlSerializer(pObject.GetType()); 
using (MemoryStream memoryStream = new MemoryStream()) 
{ 
    XmlWriterSettings settings = new XmlWriterSettings() 
    { 
     Encoding = Encoding.UTF8 
    }; 
    using (XmlWriter writer = XmlWriter.Create(memoryStream, settings)) 
    { 
     xs.Serialize(writer, pObject); 
    } 
    return Encoding.UTF8.GetString(memoryStream.ToArray()); 
} 

bir istisnası atılır, bu düzgün akışından ve XmlWriter imha edecek, durur ve henüz hala döndürür: Herşeyden

İkinci olarak, kod biraz değiştirmelisiniz UTF-8 için yazılmış XML içeren dize.

Son olarak, öneki kontrol etmek, "How to: Qualify XML Element and XML Attribute Names" bkz:

XmlSerializerNamespaces myNamespaces = new XmlSerializerNamespaces(); 
myNamespaces.Add("ps", "www.ladieda.com"); 

XmlSerializer xs = new XmlSerializer(pObject.GetType()); 
using (MemoryStream memoryStream = new MemoryStream()) 
{ 
    XmlWriterSettings settings = new XmlWriterSettings() 
    { 
     Encoding = Encoding.UTF8 
    }; 
    using (XmlWriter writer = XmlWriter.Create(memoryStream, settings)) 
    { 
     xs.Serialize(writer, pObject, myNamespaces); 
    } 
    return Encoding.UTF8.GetString(memoryStream.ToArray()); 
} 
+2

+1 Mükemmel cevap - harika açıklamalar ve iyi takip edilmesi kolay kod örnekleri. –

+0

Harika! Bu kutunun dışında çalışıyor! Teşekkürler dostum. – Michel

+0

Çok garip: Bu kod, xml dizesinin ilk karakteri olarak (hata ayıklayıcısında) görünmeyen karakter üretir. Sadece bu karakterle aynı dize ile karşılaştırırsanız veya html.en kodunu kullanırsanız görünür olmayan karakterin kodlanması nedeniyle açılır. Bu sadece 1 karakterdir ve şu ana kadarki çözüm, onu ortadan kaldırmaktır. – Michel

0

Ayrıca XmlNamespaceDeclarationsAttribute göz atın. Caveat: serileştirildiğinde, yalnızca bu öğe tarafından tanımlanan ad alanlarını verir, üst öğelerde tanımlanan ad alanlarına sahip olmaz. Tutarlı bir kök tipiniz yoksa, @John Saunders'dan XmlSerializer.Serialize() yüklemesini kullanın. Başka bir soruya @John Saunders ise

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlnamespacedeclarationsattribute.aspx

WSDL içinde kontrol xmlns açısından bu özelliği kullanarak önerir: Namespace Prefixes in Wsdl (.net)

MSDN örnek Gönderen:

// C# 
using System; 
using System.IO; 
using System.Xml.Serialization; 
[XmlRoot("select")] 
public class Select { 
    [XmlAttribute] public string xpath; 
    [XmlNamespaceDeclarations] public XmlSerializerNamespaces xmlns; 
} 
public class Test { 
    public static void Main(string[] args) { 
     Select mySelect = new Select(); 
     mySelect.xpath = "myNS:ref/@common:y"; 
     mySelect.xmlns = new XmlSerializerNamespaces(); 
     mySelect.xmlns.Add("MyNS", "myNS.tempuri.org"); 
     mySelect.xmlns.Add("common", "common.tempuri.org"); 
     XmlSerializer ser = new XmlSerializer(typeof(Select)); 
     ser.Serialize(Console.Out, mySelect); 
    } 
} 
// Output: 
// <?xml version="1.0" encoding="IBM437"?> 
// <select xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmln:xsi="http://www.w3.org/2001/XMLSchema-instance" 
// xmlns:common="common.tempuri.org" xmlns:MyNS="myNS.tempuri.org" xpath="myNS:ref/@common:y" />