【问题标题】:Deserialise XML with parameters to object将带有参数的 XML 反序列化为对象
【发布时间】:2019-01-24 08:49:18
【问题描述】:

我有一个无法反序列化为对象的简单 xml,我的模型类有问题。我只是收到一个空对象。

"<?xml version=\"1.0\" encoding=\"UTF-8\"?>
\n<response>
\n<lst name=\"responseHeader\">
   <int name=\"status\">0</int>
   <int name=\"QTime\">20596</int>
</lst>\n
</response>\n"

我这样序列化:

var x = result.Content;     
XmlSerializer serializer = new XmlSerializer(typeof(response));              
StringReader rdr = new StringReader(x);
response resultingMessage = 
(response)serializer.Deserialize(rdr);

我的模型类看起来像:

[XmlType("response")]
public class response
{
    [XmlElement("responseHeader")]
    public string Name { get; set; }
    public List<lst> Lst { get; set; }
}

public class lst
{
    [XmlElement("name")]
    public string Name { get; set; }
    [XmlElement("int")]
    public List<Int> Int { get; set; }
}

public class Int
{
    [XmlElement("status")]
    public int status { get; set; }
    [XmlElement("QTime")]
    public int QTime { get; set; }
}

【问题讨论】:

  • 你面临什么困难?你有错误吗?例外? XmlSerializer 在阻碍他序列化/反序列化对象方面非常冗长。
  • 您是否尝试在反序列化之前从您的 xml 中删除“/”?
  • 我的困难是我得到一个空对象..我想得到 QTime 值和状态值

标签: c# xml deserialization


【解决方案1】:

需要纠正一些事情。

你需要清理 Xml

XmlSerializer serializer = new XmlSerializer(typeof(response));              
StringReader rdr = new StringReader(xmlString.Replace(@"\n",String.Empty).Replace(@"\'","'"));
response resultingMessage = 
(response)serializer.Deserialize(rdr);

其次,您的数据结构需要进行一些更改。例如,响应不需要name。它必须是lst 的一部分。它也是attribute,而不是element。因此需要用[XmlAttribute]装饰

[XmlType("response")]
public class response
{
    [XmlElement("lst")]
    public List<lst> Lst { get; set; }
}

public class lst
{
    [XmlAttribute("name")]
    public string Name { get; set; }
    [XmlElement("int")]
    public List<Int> Int { get; set; }
}

public class Int
{
    [XmlAttribute(AttributeName="name")]
    public string Name { get; set; }
    [XmlText]
    public string Text { get; set; }
}

输出

【讨论】:

  • 我有结构但仍然没有值
  • @LiseOestergaard 请重新检查数据结构,有一些变化。属性也发生了变化。例如,lst.Name 使用 [XmlAttribute]
【解决方案2】:

试试这样,

/*
var x = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<response>\n<lst name=\"responseHeader\"><int name=\"status\">0</int><int name=\"QTime\">20596</int></lst>\n</response>\n";

*/

var x = result.Content;   
 x= x.Replace("\\n", string.Empty).Replace("\\", string.Empty);  
XmlSerializer serializer = new XmlSerializer(typeof(response));              
StringReader rdr = new StringReader(x);
response resultingMessage = 
(response)serializer.Deserialize(rdr);

有时额外的字符会导致转换问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2020-05-10
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多