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

如何在C#中生成带指定命名空间前缀的SOAP API请求XML?

如何在C#中生成带指定命名空间前缀的XML请求

你遇到的问题是虽然添加了命名空间,但元素没有带上对应的v1、v11前缀对吧?这是因为你没有在每个XML元素的属性配置里明确指定它们所属的命名空间,XmlSerializer没法自动把前缀和元素关联起来。下面是具体的解决方法:

步骤1:给所有类和元素指定对应的命名空间

你需要在XmlRoot、XmlElement属性里明确设置Namespace参数,把每个元素绑定到对应的命名空间URI上:

首先是根类Request的定义:

[XmlRoot("Request", Namespace = "com/user/service/core/services/v1")]
public class Request
{
    [XmlAttribute]
    public string ProductId { get; set; }

    [XmlElement("Name", Namespace = "com/user/service/core/services/v1")]
    public string Name { get; set; }

    [XmlElement("ID", Namespace = "com/user/service/core/services/v1")]
    public string ID { get; set; }

    [XmlElement("Code", Namespace = "com/user/service/core/services/v1")]
    public string Code { get; set; }

    [XmlElement("Key", Namespace = "com/user/service/core/services/v1")]
    public string Key { get; set; }

    [XmlElement("RequestKey", Namespace = "com/user/service/core/services/v1")]
    public string RequestKey { get; set; }

    [XmlElement("PartnerId", Namespace = "com/user/service/core/services/v1")]
    public string PartnerId { get; set; }

    [XmlElement("CustomerInfo", Namespace = "com/user/service/core/services/v1")]
    public CustomerInfo CustomerInfo { get; set; } = new CustomerInfo();
}

然后是嵌套的CustomerInfo及子类(为避免命名冲突,我调整了部分类名):

public class CustomerInfo
{
    [XmlElement("Name", Namespace = "com/user/service/core/services/v1")]
    public PersonName PersonName { get; set; } = new PersonName();

    [XmlElement("Number", Namespace = "com/user/service/core/services/v1")]
    public NumberInfo NumberInfo { get; set; } = new NumberInfo();
}

// 对应v11命名空间的姓名结构
public class PersonName
{
    [XmlElement("Title", Namespace = "com/user/ds/sch/pii/v1")]
    public string Title { get; set; }

    [XmlElement("Forename", Namespace = "com/user/ds/sch/pii/v1")]
    public string Forename { get; set; }

    [XmlElement("Surname", Namespace = "com/user/ds/sch/pii/v1")]
    public string Surname { get; set; }

    [XmlElement("Suffix", Namespace = "com/user/ds/sch/pii/v1")]
    public string Suffix { get; set; }
}

public class NumberInfo
{
    [XmlElement("Name", Namespace = "com/user/ds/sch/pii/v1")]
    public string Name { get; set; }

    [XmlElement("Id", Namespace = "com/user/ds/sch/pii/v1")]
    public string Id { get; set; }
}

步骤2:正确配置XmlSerializerNamespaces映射前缀

在序列化的时候,你需要创建XmlSerializerNamespaces实例,把前缀和对应的命名空间URI一一关联,包括enum的命名空间:

// 构造请求实例
var request = new Request
{
    ProductId = "string",
    Name = "string",
    ID = "string",
    Code = "string",
    Key = "string",
    RequestKey = "string",
    PartnerId = "string",
    CustomerInfo = new CustomerInfo
    {
        PersonName = new PersonName
        {
            Title = "string",
            Forename = "string",
            Surname = "string",
            Suffix = "string"
        },
        NumberInfo = new NumberInfo
        {
            Name = "string",
            Id = "string"
        }
    }
};

// 初始化序列化器和命名空间映射
var serializer = new XmlSerializer(typeof(Request));
var namespaces = new XmlSerializerNamespaces();
namespaces.Add("v1", "com/user/service/core/services/v1");
namespaces.Add("v11", "com/user/ds/sch/pii/v1");
namespaces.Add("enum", "com/user/schema/database/tcps/enumerations"); // 修正了你原拼写中的"uaer"为"user",若实际API是uaer可改回

// 执行序列化并输出结果
using (var writer = new StringWriter())
{
    serializer.Serialize(writer, request, namespaces);
    var xml = writer.ToString();
    Console.WriteLine(xml);
}

关键注意点

  • 每个XmlElement的Namespace必须和XmlSerializerNamespaces里的URI完全匹配,XmlSerializer才会给元素加上对应的前缀。
  • 嵌套类里的子元素(比如v11下的Title、Forename)也必须指定对应命名空间,否则不会生成带前缀的标签。
  • 注意命名空间URI的拼写准确性,我修正了你原代码中enum命名空间的拼写错误,若实际API要求是com/uaer/...,改回即可。

这样生成的XML就会完全符合你需要的结构,每个元素都带上了正确的v1、v11前缀,可直接用于SOAP API调用。

内容的提问来源于stack exchange,提问作者Shub

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:13:24