如何在C#中序列化指定XML Schema的EsitoRichiestaCertificatoDispositivo元素?
C# XML序列化EsitoRichiestaCertificatoDispositivo元素问题
我需要在C#中序列化一份XML Schema里的EsitoRichiestaCertificatoDispositivo元素,目前遇到序列化不符的问题。相关信息如下:
示例XML
<?xml version="1.0" encoding="UTF-8"?> <p:EsitoRichiestaCertificatoDispositivo xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/corrispettivi/v1.0" versione="1.0"> </p:EsitoRichiestaCertificatoDispositivo>
我编写的C#类
[Serializable] [XmlRootAttribute(Namespace = "http://ivaservizi.agenziaentrate.gov.it/docs/xsd/corrispettivi/v1.0", IsNullable = false)] public class EsitoRichiestaCertificatoDispositivo { public string IdOperazione; [SoapElement(DataType = "base64Binary")] public string Certificato; public ErroriType Errori; public EsitoRichiestaCertificatoDispositivo() { IdOperazione = ""; Certificato = ""; Errori = new ErroriType(); } }
对应的XML Schema为意大利税务局发布的CorrispettiviMessaggiTypes_v1.0.xsd,明确了EsitoRichiestaCertificatoDispositivo元素的结构:包含指定命名空间、versione属性,以及IdOperazione、Certificato、Errori三个子元素。
修正方案
1. 新增根元素versione属性映射
示例XML中根元素带有versione="1.0"属性,你的类未定义该属性,需添加[XmlAttribute]特性实现映射:
[XmlAttribute("versione")] public string Versione { get; set; } = "1.0";
2. 替换SOAP特性为XML序列化特性
你使用的[SoapElement]是SOAP序列化专用特性,标准XML序列化应改用[XmlElement];同时Schema中Certificato为base64Binary类型,建议用byte[]替代string,避免手动处理base64编码:
[XmlElement(DataType = "base64Binary")] public byte[] Certificato { get; set; } = Array.Empty<byte>();
3. 统一命名空间关联
在类上添加[XmlType]特性,确保所有子元素都继承根元素的命名空间,避免序列化时出现命名空间不一致问题:
[XmlType(Namespace = "http://ivaservizi.agenziaentrate.gov.it/docs/xsd/corrispettivi/v1.0")]
4. 完整修正后的类代码
[Serializable] [XmlRoot(Namespace = "http://ivaservizi.agenziaentrate.gov.it/docs/xsd/corrispettivi/v1.0", IsNullable = false)] [XmlType(Namespace = "http://ivaservizi.agenziaentrate.gov.it/docs/xsd/corrispettivi/v1.0")] public class EsitoRichiestaCertificatoDispositivo { [XmlElement] public string IdOperazione { get; set; } = string.Empty; [XmlElement(DataType = "base64Binary")] public byte[] Certificato { get; set; } = Array.Empty<byte>(); [XmlElement] public ErroriType Errori { get; set; } = new ErroriType(); [XmlAttribute("versione")] public string Versione { get; set; } = "1.0"; public EsitoRichiestaCertificatoDispositivo() { } }
5. 序列化实现示例
使用XmlSerializer完成序列化,并指定命名空间前缀,生成与示例结构一致的XML:
var serializer = new XmlSerializer(typeof(EsitoRichiestaCertificatoDispositivo)); var ns = new XmlSerializerNamespaces(); ns.Add("p", "http://ivaservizi.agenziaentrate.gov.it/docs/xsd/corrispettivi/v1.0"); ns.Add("env", "http://schemas.xmlsoap.org/soap/envelope/"); using var writer = new StringWriter(); serializer.Serialize(writer, new EsitoRichiestaCertificatoDispositivo(), ns); var xml = writer.ToString();
内容的提问来源于stack exchange,提问作者DaX
相关产品推荐
相关产品推荐

