You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:15:33