如何将带有参数数组的字符串 xml 转换为 .NET Core 中的对象
Posted
技术标签:
【中文标题】如何将带有参数数组的字符串 xml 转换为 .NET Core 中的对象【英文标题】:How I transform string xml with Array of Parameters to object in .NET Core 【发布时间】:2020-08-11 09:12:58 【问题描述】:我得到一个 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>
【问题讨论】:
当您有一个数组时,xml 序列化默认为两级标签,如参数和参数。如果您只有一个标签,那么您需要使用 [XmlArray()] [XmlElement 来代替。如果两个标签名称不同,则需要同时使用 [XmlArray("Parameters")] 和 XmlArrayItem("Item")]。 【参考方案1】:1) 你可以使用工具create XSD of the xml。
2) 拥有 XSD 后,您可以使用 Visual Studio SDK 中的 xsd.exe
从中生成 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;
【讨论】:
以上是关于如何将带有参数数组的字符串 xml 转换为 .NET Core 中的对象的主要内容,如果未能解决你的问题,请参考以下文章
PHP将带有一些(重复)元素的XML转换为Json到Json数组[重复]
如何将带有对象数组的 json 字符串转换为带有 nsdictionaries 的 nsarray - IOS