如何在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
相关产品推荐
相关产品推荐

