【问题标题】:Unable to deserialize xml array to list web api model c#无法反序列化 xml 数组以列出 web api 模型 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,我已经纠正了错误,但数组路径仍然为零计数。请帮助检查您自己的结果。谢谢

标签: c# xml asp.net-web-api serialization


【解决方案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;
     }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 2021-12-22
    • 2013-04-26
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    相关资源
    最近更新 更多