繁体   English   中英

将XML反序列化为C#对象

[英]deserialize xml to c# object

我有以下xml(我无法编辑):

<?xml version="1.0" encoding="UTF-8"?>

<ns0:prices xmlns:ns0="http://schemas.some.com/sadas/Output">
  <pricepoint>
    <esid>
      ENG.GPL.DAY_AHEAD.PROMPT.PH.M
    </esid>
    <observationdate>20120123</observationdate>
    <observationtime>0000</observationtime>
    <price>22.1250</price>
    <quote>Q</quote>
  </pricepoint>
  <pricepoint>
    <esid>
      ENG.NBP.DAY_AHEAD.PROMPT.PH.M
    </esid>
    <observationdate>20120123</observationdate>
    <observationtime>0000</observationtime>
    <price>53.8500</price>
    <quote>Q</quote>
  </pricepoint>
  <pricepoint>
    <esid>
      ENG.NCG.DAY_AHEAD.PROMPT.PH.M
    </esid>
    <observationdate>20120123</observationdate>
    <observationtime>0000</observationtime>
    <price>22.0750</price>
    <quote>Q</quote>
  </pricepoint>
  <pricepoint>
    <esid>
      ENG.TTF.DAY_AHEAD.PROMPT.PH.M
    </esid>
    <observationdate>20120123</observationdate>
    <observationtime>0000</observationtime>
    <price>21.9500</price>
    <quote>Q</quote>
  </pricepoint>
  <pricepoint>
    <esid>
      ENG.ZEEBRUGGE.DAY_AHEAD.PROMPT.PH.M
    </esid>
    <observationdate>20120123</observationdate>
    <observationtime>0000</observationtime>
    <price>53.6500</price>
    <quote>Q</quote>
  </pricepoint>
</ns0:prices>

和以下对象,我想将其映射到:

[Serializable]
public class Prices 
{

    public List<Pricepoint> prices { get; set; }
}

[Serializable]
public class Pricepoint
{

    public string Esid { get; set; }

    public DateTime Observationdate { get; set; }

    public int Observationtime { get; set; }

    public double Price { get; set; }

    public string Quote { get; set; }

}

使用以下方法:

    public static object Deserialize(Type typeToDeserialize,byte[] bytes)
    {
        var mem = new MemoryStream(bytes);
        var ser = new XmlSerializer(typeToDeserialize);
        return ser.Deserialize(mem);
    }

Deserialize(typeof(Prices), byteArrayofXMLfile);

但是,我确实收到有关xml的名称空间行的错误:

There is an error in XML document (3, 2)

我无法弄清楚我在做什么错?

编辑 :重新阅读,看到您在问有关名称空间。 如下所示,使用XmlRootAttributeNamespace属性。


您需要通过属性告诉XmlSerializer哪些标签映射到哪些属性:

[Serializable]
[XmlRoot(Namespace = "http://www.ZomboCorp.com/", ElementName="prices")]
public class Prices 
{
    [XmlElement("pricepoint")]
    public List<Pricepoint> prices { get; set; }
}

[Serializable]
public class Pricepoint
{

    [XmlElement("esid")]
    public string Esid { get; set; }

    [XmlElement("observationdate")]
    public DateTime Observationdate { get; set; }

    [XmlElement("observationtime")]
    public int Observationtime { get; set; }

    [XmlElement("price")]
    public double Price { get; set; }

    [XmlElement("quote")]
    public string Quote { get; set; }

}

像这样吗

XmlRootAttribute r = new XmlRootAttribute("prices");
r.Namespace = "http://schemas.some.com/sadas/Output";

var ser = new XmlSerializer(typeof(Prices),r);
return ser.Deserialize(mem);

PS:您还应该考虑标签名称的大小写

通过让Visual Studio为我生成类来解决该问题:

C:\>xsd latest.xml
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 4.0.30319.1]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'C:\latest.xsd'.

C:\>xsd latest.xsd /classes
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 4.0.30319.1]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'C:\latest.cs'.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM