无法反序列化 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# 对象