2016-07-02 44 views
0

Ich habe 2 Klasse von 2 verschiedenen xsd, einer von ihnen ist Kind-Knoten, die Wurzel-Klasse hat eine Eigenschaft (xmlelement Array) für das Kind, ich brauche den Kind-Knoten hat andere Präfix, das ist meine Code:Serialize XML mit verschiedenen Präfix

var xml = //this is the root xml 
var nom = //this is the child node 

var stream = new MemoryStream(); 

var xmlSerializeNomina = new XmlSerializer(typeof(ChildClass)); 

var xmlNameSpaceNom = new XmlSerializerNamespaces(); 

//Here add namespace because i need the prefix in child node 
xmlNameSpaceNom.Add("childPrefix", "http://www.url.com/child"); 
var doc = new XmlDocument(); 
using (var writer = new XmlTextWriter(stream, Encoding.UTF8)) 
{ 
    writer.Formatting = Formatting.Indented; 

    xmlSerializeNomina.Serialize(writer, nom, xmlNameSpaceNom); 

    stream.Seek(0, SeekOrigin.Begin); 

    doc.Load(stream); 

} 
//This is the xmlelement array property 
xml.Complemento.Any = new XmlElement[] { doc.ImportNode(doc.DocumentElement, true) as XmlElement }; 

Dann serialisiert ich die Wurzel:

var xmlNameSpace = new XmlSerializerNamespaces(); 

xmlNameSpace.Add("rootPrefix", "http://www.url.com/foo"); 
xmlNameSpace.Add("nsPrefix", "http://www.url.com/foo"); 
xmlNameSpace.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 

var urls += "http://www.url.com/foo http://www.url.com/root.xsd http://www.url.com/url_child http://www.url.com/url_child/child.xsd"; 

//Here add then child namespace because i need it in root node  
xmlNameSpace.Add("childPrefix", "http://www.url.com/child"); 

xmlNameSpace.Add("schemaLocation", urls); 

var xmlSerializeFactura = new XmlSerializer(typeof(RootClass)); 

using (var xmlTextWriter = new XmlTextWriter("pathAndName.xml", Encoding.UTF8)) 
{ 
    xmlTextWriter.Formatting = Formatting.Indented; 

    xmlSerializeFactura.Serialize(xmlTextWriter, xml, xmlNameSpace); 
} 

die xML-Datei war in richtigen Format erstellen, aber das Kind root den Namensraum hat und ich brauche nicht dort, nur in Wurzelknoten .

<?xml version="1.0" encoding="utf-8"?> 
<rootPrefix:Comprobante xmlns:schemaLocation="http://www.url.com/foo http://www.url.com/root.xsd http://www.url.com/child http://www.url.com/child/child.xsd" xmlns:nsPrefix="http://www.url.com/foo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.url.com/foo http://www.url.com/root.xsd" xmlns:rootPrefix="http://www.url.com/foo"> 
    <rootPrefix:tags> 
    Some more tags... 
    </rootPrefix:tags 
    <rootPrefix:Complemento> 
    '<!--' in this part is added the namespace, i don't need it here because i have already on root tag but if I don't add it this child tag haven't prefix '-->' 
    <childPrefix:Tag xmlns:childPrefix="http://www.url.com/child"> 
     Some childs tags.. 
    </childPrefix:Tag> 
    </rootPrefix:Complemento> 
</rootPrefix:Comprobante> 
+0

Es ist nicht klar, was Sie hier fragen. Es wäre viel klarer, wenn Sie ein [mcve] zeigen und einbeziehen, wie Ihr XML aussieht, wie es Ihrer Meinung nach aussehen sollte. –

+0

Sie haben Recht, ich habe mit einem Beispiel der XML bearbeitet. – elchente23

+0

Ihr XML-Kommentar sagt "Ich habe bereits auf Root-Tag", aber Sie haben es nicht im Root-Element? –

Antwort

0

Tun Sie es einfach

[XmlRoot(Namespace = "http://www.url.com/foo")] 
public class Comprobante 
{ 
    public string Tags { get; set; } 
    public Complemento Complemento { get; set; } 
} 

[XmlType(Namespace = "http://www.url.com/foo")] 
public class Complemento 
{ 
    [XmlElement(Namespace = "http://www.url.com/child")] 
    public string Tag { get; set; } 
} 
var child = new Complemento { Tag = "tag" }; 
var root = new Comprobante { Tags = "tags", Complemento = child }; 

XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
ns.Add("rootPrefix", "http://www.url.com/foo"); 
ns.Add("childPrefix", "http://www.url.com/child"); 

var xs = new XmlSerializer(typeof(Comprobante)); 

xs.Serialize(Console.Out, root, ns); 

Im Ergebnis würde der untergeordneten Knoten keinen Namespace-Definition haben. Wie du willst.

+0

Danke für Ihre Antwort, wie ich mit der Serialisierung umgehen könnte, wenn die Tag-Eigenschaft ein xmlelement-Array ist. – elchente23