c# - 如何将带有参数数组的字符串 xml 转换为 .NET Core 中的对象
问题描述
我得到一个 xml 字符串,我需要将此 xml 转换为 .NET 对象然后,创建一个服务来反序列化或 xml。但它不适用于“参数”道具。
代码:
[XmlRoot(ElementName = "mse-response")]
public class xmlObject
{
[XmlElement(DataType = "string", ElementName = "status-code")]
public string StatusCode { get; set; }
[XmlElement(DataType = "string", ElementName = "profile")]
public string Profile { get; set; }
[XmlElement(DataType = "string", ElementName = "transaction-id")]
public string TransactionId { get; set; }
[XmlArray(ElementName = "parameters")]
public Item[] Parameters { get; set; }
}
public class Item
{
[XmlElement(ElementName = "param-name")]
public string Name { get; set; }
[XmlElement(ElementName = "param-value")]
public string Value { get; set; }
}
帮手:
public class XmlHelperService
{
public static T XmlDeserializeFromString<T>(string xmlString)
{
var serializar = new XmlSerializer(typeof(T));
using (var reader = new StringReader(xmlString))
{
return (T)serializar.Deserialize(reader);
}
}
}
还有我的 XML:
<?xml version="1.0" encoding="UTF-8" ?>
<mse-response>
<status-code>0</status-code>
<profile>profleID</profile>
<transaction-id>1010608241424538336</transaction-id>
<parameters>
<param-item>
<param-name>INITIALDATE</param-name>
<param-value>0608151207</param-value>
</param-item>
<param-item>
<param-name>SMPP_MESSAGE_STATUS</param-name>
<param-value>DELIVRD</param-value>
</param-item>
<param-item>
<param-name>ANUM</param-name>
<param-value>333</param-value>
</param-item>
<param-item>
<param-name>BNUM</param-name>
<param-value>1191000000</param-value>
</param-item>
<param-item>
<param-name>FINALDATE</param-name>
<param-value>0608151207</param-value>
</param-item>
<param-item>
<param-name>MSGSTATUS</param-name>
<param-value>2</param-value>
</param-item>
</parameters>
</mse-response>
解决方案
1)您可以使用工具来创建 xml 的 XSD。
2) 拥有 XSD 后,您可以使用xsd.exe
Visual Studio SDK 从中生成 C# 类。
命令是:
xsd.exe /classes /namespace:MyTest generatedXsd.xsd
3) XSD 或者生成的类可以添加到你的项目中,或者在这个测试中我们只在属性中查看生成的类properties
,以了解它是如何生成的:
[System.Xml.Serialization.XmlArrayItemAttribute("param-item", IsNullable=false)]
public mseresponseParamitem[] parameters {
get {
return this.parametersField;
}
set {
this.parametersField = value;
}
}
因此,解决方案是,在类中xmlObject
定义具有属性properties
的XmlArrayItemAttribute
属性:
[XmlRoot(ElementName = "mse-response")]
public class xmlObject
{
...
[XmlArrayItemAttribute("param-item", IsNullable = false)]
public Item[] parameters { get; set; }
}
推荐阅读
- python - 字典中numpy数组列的Python min/max
- android - 如何在没有背景噪音的情况下录制音频(心音)(例如:车辆声音、电视声音)
- kubernetes - 为什么 Kubernetes 中的 pod 会自动挂载服务帐户密钥?
- mysql - 如何一次从所有表中选择?
- sql - 两个元组之间的 SQL 索引,AND 条件
- reactjs - 尝试使用 redux-thunk,但它显示错误,即使对我来说一切都很好
- postgresql - 返回诗的总数,提到死亡的诗和提到爱的诗的平均字符数
- spring-boot - 使用 openhtmltopdf 将 HTML 内容绘制到现有的 PDDocument
- sql-server - 为什么 sqlpackage 发布操作需要 30 分钟?
- express - 从数据库传递对象数组时Expressjs访问控制错误