如何将带有参数数组的字符串 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 类中定义属性 propertiesXmlArrayItemAttribute 属性:

[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 转换为 XML - 带有数组值的 Json

如何将带有对象数组的 json 字符串转换为带有 nsdictionaries 的 nsarray - IOS

将带有空格分隔符的字符串转换为数组。并输出这个数组,就像一个字符串

如何在 Java 中将 xsl 应用于 xml

如何将带有图像的字节数组从 AS3 发送到 PHP?