Multiple Namespaces with XmlSerializer

This is the scenario:

I have nested classes and need to serialize then in an XML document

[XmlRoot(Namespace="http://www.foo.bar/myschema")] public class root { [XmlAttribute] public string version { get; set; } [XmlElement] public child child { get; set; } ... } [XmlRoot(Namespace="http://www.foo.bar/myschema")] public class child { [XmlElement] public int elemA { get; set; } [XmlElement] public string elemB { get; set; } ... } 

I created a method based on another example to remove additional namespaces and set up a custom one:

 public static void Save<T>(this T type, string path) { System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(type.GetType()); System.Xml.Serialization.XmlSerializerNamespaces ns = new System.Xml.Serialization.XmlSerializerNamespaces(); ns.Add("", "http://www.foo.bar/myschema"); using(XmlWriter file = XmlWriter.Create(path)) { xs.Serialize(file, type, ns); } } 

And I get this code as a result:

 <?xml version="1.0" encoding="utf-8"?> <root xmlns="http://www.foo.bar/myschema" version="2.00"> <child> <elemA>1</elemA> ... </child> </root> 

But expected this:

 <?xml version="1.0" encoding="utf-8"?> <root xmlns="http://www.foo.bar/myschema" version="2.00"> <child xmlns="http://www.foo.bar/myschema"> <elemA>1</elemA> ... </child> </root> 

We must set the declaration of the user namespace in both tags. Is it possible?

Edit:

Here is an example of the real world:

 <?xml version="1.0" encoding="UTF-8"?> <enviNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.01"> <idLote>200602220000001</idLote> <NFe xmlns="http://www.portalfiscal.inf.br/nfe"> <infNFe Id="NFe31060243816719000108550000000010001234567890" versao="1.01"> ... <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> ... </NFe> <NFe xmlns="http://www.portalfiscal.inf.br/nfe"> <infNFe Id="NFe31060243816719000108550000000010011234567900" versao="1.01"> ... <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> ... </NFe> <NFe xmlns="http://www.portalfiscal.inf.br/nfe"> <infNFe Id="NFe31060243816719000108550000000010021234567916" versao="1.01"> ... <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> ... </NFe> </enviNFe> 
+4
source share
1 answer

From an XML perspective, your examples are identical, so the first one is great. If you need to use the second, there is a serious problem with our understanding of XML or the processing pipeline.

+1
source

Source: https://habr.com/ru/post/1382555/


All Articles