无法反序列化 xml 数组以列出 web api 模型 c#

Posted

技术标签:

【中文标题】无法反序列化 xml 数组以列出 web api 模型 c#【英文标题】:Unable to deserialize xml array to list web api model c# 【发布时间】:2021-09-24 20:11:16 【问题描述】:

大家好, 我已经能够在我的 web api 项目中将我的 xml 序列化为我的模型。但我面临的挑战是数组部分或列表部分没有被序列化,它的输出为空。 请在下面检查我的 xml 和模型,参数没有被映射。 谢谢

--模型--

[DataContract(Namespace="")]
[XmlRoot(ElementName = "ValidationRequest")]
public class ValidationRequest

    [DataMember]
    [XmlElement(ElementName = "SourceBankCode")]        
    public string SourceBankCode  get; set; 
    [DataMember]
    [XmlElement(ElementName = "SourceBankName")]
    public string SourceBankName  get; set; 
    [DataMember]
    [XmlElement(ElementName = "InstitutionCode")]
    public int InstitutionCode  get; set;         
    [DataMember]
    [XmlElement(ElementName = "ProductID")]
    public int ProductID  get; set; 
    [DataMember]
    [XmlElement(ElementName = "ProductName")]
    public string ProductName  get; set; 
    [DataMember]
    [XmlElement(ElementName = "Param")]
    public List<Param> Param  get; set; 


[XmlRoot(ElementName = "Param")]
public class Param

    [DataMember]
    [XmlElement(ElementName = "Key")]
    public string Key  get; set; 
    [DataMember]
    [XmlElement(ElementName = "Value")]
    public string Value  get; set; 

-- 正在传递的 XML--

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ValidationRequest>
    <SourceBankCode>221</SourceBankCode>
    <SourceBankName>Stanbic IBTC Bank Plc.</SourceBankName>
    <InstitutionCode>999221</InstitutionCode>
    <ProductID>990</ProductID>
    <ProductName>NIBSS ebillsPay</ProductName>
    <Param>
        <Key>Username</Key>
        <Value>3191469</Value>
    </Param>
    <Param>
        <Key>Amount</Key>
        <Value>500</Value>
    </Param>
    <Param>
        <Key>Description</Key>
        <Value>Text Books</Value>
    </Param>
    <Param>
        <Key>DepositorName</Key>
        <Value>Ayomide</Value>
    </Param>
</ValidationRequest>

【问题讨论】:

您是否尝试序列化或反序列化此 XML? 正在传递的 XML 似乎暗示您收到了 XML。 -- 最简单的反序列化:var validation = new XmlSerializer(typeof(ValidationRequest)).Deserialize(XmlReader.Create(xml)); 没有问题。 您好 Jimi,对不起我的错误主题,我会编辑它。我想反序列化。我会试试你的方法。谢谢 嗨 Jimi,我试过你的代码,它带来了一个错误:路径中的非法字符 嗨@Jimi,我已经纠正了错误,但数组路径仍然为零计数。请帮助检查您自己的结果。谢谢 【参考方案1】:

您可以尝试使用以下从 XML 生成 C# 类。

https://json2csharp.com/xml-to-csharp

// using System.Xml.Serialization;
// XmlSerializer serializer = new XmlSerializer(typeof(ValidationRequest));
// using (StringReader reader = new StringReader(xml))
// 
//    var test = (ValidationRequest)serializer.Deserialize(reader);
// 

[XmlRoot(ElementName="Param")]
public class Param  

    [XmlElement(ElementName="Key")] 
    public string Key  get; set;  

    [XmlElement(ElementName="Value")] 
    public int Value  get; set;  


[XmlRoot(ElementName="ValidationRequest")]
public class ValidationRequest  

    [XmlElement(ElementName="SourceBankCode")] 
    public int SourceBankCode  get; set;  

    [XmlElement(ElementName="SourceBankName")] 
    public string SourceBankName  get; set;  

    [XmlElement(ElementName="InstitutionCode")] 
    public int InstitutionCode  get; set;  

    [XmlElement(ElementName="ProductID")] 
    public int ProductID  get; set;  

    [XmlElement(ElementName="ProductName")] 
    public string ProductName  get; set;  

    [XmlElement(ElementName="Param")] 
    public List<Param> Param  get; set;  

【讨论】:

感谢@Thomson Mixab 的帮助,它仍然没有带来参数列表。计数仍然为零 而且它总是说 xml 中有错误【参考方案2】:
using (var fs = new FileStream("ValidationRequest.xml", FileMode.Open, FileAccess.Read))

    var request = new XmlSerializer(typeof(ValidationRequest)).Deserialize(fs);

我试过这个没有任何问题。您使用的是哪个 .NET 版本?

【讨论】:

你好郭浩,我不是从文件中获取 xml,它的 web api 项目。它应该将 xml 映射到我的对象模型【参考方案3】:

好吧,归根结底,我不得不使用下面的 hack 来实现我的目的,因为数组没有自动映射。

    public ValidationResponse Validation(XElement xml)
    
        var response = new ValidationResponse();
                    
        var xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(xml.ToString());
        var str = xmlDoc.InnerXml;

        XmlSerializer serializer = new XmlSerializer(typeof(ValidationRequest));
        using (StringReader reader = new StringReader(str))
        
            var test = (ValidationRequest)serializer.Deserialize(reader);

            XmlElement root = xmlDoc.DocumentElement;
            XmlNodeList nodes = root.SelectNodes("Param");
            foreach (XmlNode node in nodes)
            
                if (node.NodeType == XmlNodeType.Element)
                
                    var param = new Param();
                    param.Key = node.ChildNodes.Item(0).InnerText;
                    param.Value = node.ChildNodes.Item(1).InnerText;
                    test.Param.Add(param);
                
            
            //rest of other code processes
        
        return response;
     

【讨论】:

以上是关于无法反序列化 xml 数组以列出 web api 模型 c#的主要内容,如果未能解决你的问题,请参考以下文章

将 Web 服务 API 中的 XML 字符串反序列化为 C# 对象

使用 Jackson 反序列化重复键以列出

jackson xml反序列化内联数组

无法反序列化 JSON 响应

在 C# 中为 WCF 服务反序列化简单的 XML 数组对象

使用来自 URL 的 JSON.NET 反序列化 JSON 数组