XML转C#实体类还原XML异常求助:缺失命名空间等属性
XML转C#实体类:解决命名空间与前缀缺失问题
先修正示例XML的语法错误
原示例中<PermissiblePurpose>标签未正确闭合,修正后如下:
<p:EIDVBusinessSearch xmlns:p="example.com" xmlns:xsi="abc.com" xsi:schemaLocation="cde.com"> <PermissiblePurpose> <GLB>{{GLB}}</GLB> <DPPA>{{DPPA}}</DPPA> <VOTER>{{VOTER}}</VOTER> </PermissiblePurpose> </p:EIDVBusinessSearch>
正确的C#实体类实现
通过XmlSerializer特性精准控制XML命名空间和前缀:
using System.Xml.Serialization; [XmlRoot(ElementName = "EIDVBusinessSearch", Namespace = "example.com", Prefix = "p")] public class EIDVBusinessSearch { // 声明XML命名空间 [XmlNamespaceDeclarations] public XmlSerializerNamespaces Xmlns { get; set; } = new XmlSerializerNamespaces(); // 根元素的xsi:schemaLocation属性 [XmlAttribute(AttributeName = "schemaLocation", Namespace = "abc.com")] public string SchemaLocation { get; set; } = "cde.com"; [XmlElement(ElementName = "PermissiblePurpose")] public PermissiblePurpose PermissiblePurpose { get; set; } public EIDVBusinessSearch() { // 初始化命名空间绑定 Xmlns.Add("p", "example.com"); Xmlns.Add("xsi", "abc.com"); } } public class PermissiblePurpose { [XmlElement(ElementName = "GLB")] public string GLB { get; set; } [XmlElement(ElementName = "DPPA")] public string DPPA { get; set; } [XmlElement(ElementName = "VOTER")] public string VOTER { get; set; } }
序列化代码示例
使用上述实体类生成符合要求的XML:
using System.IO; using System.Xml.Serialization; var request = new EIDVBusinessSearch { PermissiblePurpose = new PermissiblePurpose { GLB = "{{GLB}}", DPPA = "{{DPPA}}", VOTER = "{{VOTER}}" } }; var serializer = new XmlSerializer(typeof(EIDVBusinessSearch)); using var writer = new StringWriter(); serializer.Serialize(writer, request, request.Xmlns); var outputXml = writer.ToString();
关键特性说明
- XmlRoot:指定根元素的命名空间和前缀,确保生成
<p:EIDVBusinessSearch>标签 - XmlNamespaceDeclarations:用于定义XML文档中的命名空间声明(
xmlns:p、xmlns:xsi) - XmlAttribute:为根元素添加
xsi:schemaLocation属性,匹配API要求的格式 - 子元素无
p:前缀,因此无需额外指定命名空间,保持默认即可
内容的提问来源于stack exchange,提问作者Khan
相关产品推荐
相关产品推荐

