2016-11-17 317 views
0

我正尝试使用XMLSerializer在少数元素中的一个元素中生成名称空间前缀的XML。只需要在一个XML元素中添加XML名称空间前缀

下面是代码 -

var commRemision = new Contracts.Dtos.Remision(); 
Transformer transformedRequest = new Transformer(); 
commRemision = transformedRequest.TransformRequest(dgRemision); 

public const string ElementNamespace = "http://www.buzonfiscal.com/ns/xsd/bf/remision/52"; 

XmlSerializerNamespaces xmlNamespace = new XmlSerializerNamespaces(); 
xmlNamespace.Add(string.Empty, ElementNamespace); ///remove default namespaces 

var serializer = new XmlSerializer(commRemision.GetType(), ElementNamespace); 

XmlWriterSettings settings = new XmlWriterSettings(); 
settings.Encoding = new UnicodeEncoding(false, false); // no BOM in a .NET string 
settings.Indent = true; 
settings.OmitXmlDeclaration = false; 

using (StringWriter textWriter = new StringWriter()) 
{ 
    using (XmlWriter xmlWriter = XmlWriter.Create(textWriter, settings)) 
    { 
     serializer.Serialize(xmlWriter, commRemision, xmlNamespace); 
    } 
} 

和阶级结构 -

public class Remision 
{ 
    [XmlElement] 
    public InfoBasica InfoBasica { get; set; } 
    [XmlElement] 
    public Addenda Addenda { get; set; } 
} 

public class InfoBasica 
{ 
    [XmlAttribute] 
    public int folio { get; set; } 
} 

[XmlRoot("Addenda", Namespace = Addenda.ElementNamespace)] 
public class Addenda 
{ 
    public const string ElementNamespace = "http://www.buzonfiscal.com/ns/addenda/bf/2"; 

    [XmlElement(Namespace = ElementNamespace)] 
    public List<AddendaBuzonFiscal> AddendaBuzonFiscal { get;set;} 
} 

public class AddendaBuzonFiscal 
{ 
    [XmlElement(ElementName = "Emisor")] 
    public AddendaEmisor Emisor { get; set; } 

    [XmlElement] 
    public AddendaReceptor Receptor { get; set; } 

    [XmlElement] 
    public TipoDocumento TipoDocumento { get; set; } 
} 

现在我需要我的XML是这样的 -

<Remision version="5.2" xmlns="http://www.buzonfiscal.com/ns/xsd/bf/remision/52"> 
<InfoBasica folio="10240" /> 
<Addenda> 
<ns:AddendaBuzonFiscal version="2.0" xmlns:ns="http://www.buzonfiscal.com/ns/addenda/bf/2"> 
<ns:Emisor telefono="8787826600" /> 
<ns:Receptor telefono="1234567" /> 
<ns:TipoDocumento nombreCorto="FAC" /> 
</ns:AddendaBuzonFiscal> 
</Addenda> 
</Remision> 

但无法添加ns元素中的前缀。我所能够产生是这样的 -

<Remision version="5.2" xmlns="http://www.buzonfiscal.com/ns/xsd/bf/remision/52"> 
<InfoBasica folio="10240" /> 
<Addenda> 
<AddendaBuzonFiscal version="2.0" xmlns:ns="http://www.buzonfiscal.com/ns/addenda/bf/2"> 
<Emisor telefono="8787826600" /> 
<Receptor telefono="1234567" /> 
<TipoDocumento nombreCorto="FAC" /> 
</AddendaBuzonFiscal> 
</Addenda> 
</Remision> 

请注意,我需要空间前缀只在AddendaBuzonFiscal标签不在XML的每一个标签。

请帮忙。

+0

你的第二位o f XML不是*您将生成的内容 - 它将是'AddendaBuzonFiscal'中的'xmlns =“..”',而不是'xmlns:ns =“..”'。鉴于此,这两者在语义上是相同的。你需要提供原因,为什么这不被接受。 –

回答

0

添加前缀别名XmlSerializerNamespaces

xmlNamespace.Add("ns", "http://www.buzonfiscal.com/ns/addenda/bf/2"); 
+0

谢谢..这是一个很大的帮助,但一个小故障。此代码将第二个名称空间添加顶部标记(Remission),并且我需要AddendaBuzzonFiscal标记中的名称空间。 –

+0

现在我的顶部标签看起来像这样 - 和底部的一个这样的 -

+0

@AbhinavSingh - 解析器无关紧要,其中声明的名称空间。 –

0

你应该有,而不是依靠XmlSerializer这样一个命名空间声明一样,你自己的XML序列化逻辑:

public abstract class XmlSerializationBase : IXmlSerializable 
{ 
    public XmlSchema GetSchema() 
    { 
     return default(XmlSchema); 
    } 

    public virtual void ReadXml(XmlReader reader) 
    { 
     throw new NotImplementedException(); 
    } 

    public virtual void WriteXml(XmlWriter writer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

public class InfoBasica 
{ 
    public string Folio { get; set; } 
} 

[XmlRoot(ElementName = "Emisor")] 
public class Emisor 
{ 
    [XmlAttribute(AttributeName = "telefono")] 
    public string Telefono { get; set; } 
} 

[XmlRoot(ElementName = "Receptor")] 
public class Receptor 
{ 
    [XmlAttribute(AttributeName = "telefono")] 
    public string Telefono { get; set; } 
} 

[XmlRoot(ElementName = "TipoDocumento")] 
public class TipoDocumento 
{ 
    [XmlAttribute(AttributeName = "nombreCorto")] 
    public string NombreCorto { get; set; } 
} 

[XmlRoot(ElementName = "AddendaBuzonFiscal", Namespace = "http://www.buzonfiscal.com/ns/addenda/bf/2")] 
public class AddendaBuzonFiscal 
{ 
    [XmlElement(ElementName = "Emisor", Namespace = "http://www.buzonfiscal.com/ns/addenda/bf/2")] 
    public Emisor Emisor { get; set; } 

    [XmlElement(ElementName = "Receptor", Namespace = "http://www.buzonfiscal.com/ns/addenda/bf/2")] 
    public Receptor Receptor { get; set; } 

    [XmlElement(ElementName = "TipoDocumento", Namespace = "http://www.buzonfiscal.com/ns/addenda/bf/2")] 
    public TipoDocumento TipoDocumento { get; set; } 

    [XmlAttribute(AttributeName = "version")] 
    public string Version { get; set; } 
} 

public class Addenda : XmlSerializationBase 
{ 
    public AddendaBuzonFiscal AddendaBuzonFiscal { get; set; } 

    public override void WriteXml(XmlWriter writer) 
    { 
     writer.WriteStartElement("Addenda"); 

     var serializer = new XmlSerializer(typeof(AddendaBuzonFiscal)); 
     var namespaces = new XmlSerializerNamespaces(); 
     namespaces.Add("ns", "http://www.buzonfiscal.com/ns/addenda/bf/2"); 
     serializer.Serialize(writer, AddendaBuzonFiscal, namespaces); 

     writer.WriteEndElement(); 
    } 
} 

public class Remision : XmlSerializationBase 
{ 
    public InfoBasica InfoBasica { get; set; } 

    public Addenda Addenda { get; set; } 

    public string Version { get; set; } 

    public override void WriteXml(XmlWriter writer) 
    { 
     writer.WriteStartElement("Remision", "http://www.buzonfiscal.com/ns/xsd/bf/remision/52"); 
     writer.WriteAttributeString("version", Version); 
     writer.WriteStartElement("InfoBasica"); 

     writer.WriteAttributeString("folio", InfoBasica.Folio); 
     writer.WriteEndElement(); 

     Addenda.WriteXml(writer); 

     writer.WriteEndElement(); 
    } 
} 

,并生成XML的代码不再使用序列化程序:

 var settings = new XmlWriterSettings(); 
     settings.Encoding = new UnicodeEncoding(false, false); // no BOM in a .NET string 
     settings.Indent = true; 
     settings.OmitXmlDeclaration = false; 

     var commRemision = new Remision 
     { 
      Version = "5.2", 
      InfoBasica = new InfoBasica { Folio = "10240" }, 
      Addenda = new Addenda 
      { 
       AddendaBuzonFiscal = new AddendaBuzonFiscal 
       { 
        Version = "2.0", 
        Emisor = new Emisor { Telefono = "8787826600" }, 
        Receptor = new Receptor { Telefono = "1234567" }, 
        TipoDocumento = new TipoDocumento { NombreCorto = "FAC" } 
       } 
      } 
     }; 

     using(var stream = new MemoryStream()) 
     { 
      using(var writer = new StreamWriter(stream)) 
      { 
       using (XmlWriter xmlWriter = XmlWriter.Create(writer, settings)) 
       { 
        commRemision.WriteXml(xmlWriter); 
       } 
       stream.Position = 0; 
       using (var reader = new StreamReader(stream)) 
       { 
        Console.WriteLine(reader.ReadToEnd()); 
       } 
      } 
     } 

     Console.ReadLine();