C# .NET Core中带自定义命名空间的JSON转SOAP XML求助
解决方案:JSON转带自定义命名空间的SOAP XML(C# .NET Core)
要还原带自定义命名空间前缀的SOAP XML,核心是让序列化过程明确映射JSON对象到带命名空间的XML节点,可通过以下步骤实现:
1. 定义带XML命名空间属性的实体类
根据目标XML结构,给每个实体类/属性添加XmlRoot、XmlElement特性,指定对应的命名空间:
using System.Xml.Serialization; [XmlRoot(ElementName = "APIRequest", Namespace = "http://Some-test-namespace.xsd")] public class APIRequest { [XmlElement(ElementName = "APIRequestDetails", Namespace = "http://Some-test-namespace.xsd")] public APIRequestDetails APIRequestDetails { get; set; } } public class APIRequestDetails { [XmlElement(ElementName = "Individual", Namespace = "http://Some-test-namespace.xsd")] public Individual Individual { get; set; } } public class Individual { [XmlElement(ElementName = "IndividualKey", Namespace = "http://Some-test-namespace.xsd")] public string IndividualKey { get; set; } }
2. 实现JSON转实体 + 实体转带命名空间的XML
先将JSON反序列化为实体对象,再用XmlSerializer结合XmlSerializerNamespaces指定前缀与命名空间的映射,生成目标XML:
using System.IO; using System.Xml; using System.Xml.Serialization; using Newtonsoft.Json; public string JsonToSoapXml(string json) { // 1. JSON反序列化为实体 var apiRequest = JsonConvert.DeserializeObject<APIRequest>(json); // 2. 配置命名空间前缀映射 var xmlNamespaces = new XmlSerializerNamespaces(); xmlNamespaces.Add("asr", "http://Some-test-namespace.xsd"); xmlNamespaces.Add("ar", "http://Some-test-namespace.xsd"); xmlNamespaces.Add("guid", "http://Some-test-namespace.xsd"); xmlNamespaces.Add("asw", "http://Some-test-namespace.xsd"); xmlNamespaces.Add("xsi", "https://www.w3.org/2001/XMLSchema"); // 3. 序列化实体为XML var serializer = new XmlSerializer(typeof(APIRequest)); using var stringWriter = new StringWriter(); using var xmlWriter = XmlWriter.Create(stringWriter, new XmlWriterSettings { Indent = true, OmitXmlDeclaration = true // 去掉默认XML声明,与示例结构一致 }); serializer.Serialize(xmlWriter, apiRequest, xmlNamespaces); return stringWriter.ToString(); }
3. 测试验证
调用方法传入目标JSON,即可生成与示例一致的SOAP XML:
var json = @" { ""APIRequest"": { ""APIRequestDetails"": { ""Individual"": { ""IndividualKey"": ""3791239123-123123123-1231231"" } } } }"; var soapXml = JsonToSoapXml(json); Console.WriteLine(soapXml);
关键说明
- 命名空间URL必须与原SOAP XML完全一致,否则无法正确映射前缀。
XmlSerializerNamespaces用于显式绑定前缀和命名空间,确保生成的XML使用指定的asr、ar等前缀。- 若使用
System.Text.Json替代Newtonsoft.Json,只需将反序列化代码替换为:var apiRequest = JsonSerializer.Deserialize<APIRequest>(json);
内容的提问来源于stack exchange,提问作者Makki Anjum
相关产品推荐
相关产品推荐

