无法在C#中反序列化XML

时间:2015-07-07 11:17:47

标签: c# xml xmlserializer xml-deserialization

我在尝试反序列化以下XML时遇到了一些问题:

<?xml version=\"1.0\" encoding=\"utf-8\"?>
<Response xmlns=\"http://Microsoft.LobServices.Sap/2007/03/Rfc/\">
<E_ARR>
    <ITEM xmlns=\"http://Microsoft.LobServices.Sap/2007/03/Types/Rfc/\">
        <PROPA>00100000</PROPA>
        <PROPB>0815</PROPB>
    </ITEM>
    <ITEM xmlns=\"http://Microsoft.LobServices.Sap/2007/03/Types/Rfc/\">
        <PROPA>00100001</PROPA>
        <PROPB>0123</PROPB>
    </ITEM>
</E_ARR>
</Response>

使用以下代码行:

var reader = new StringReader(XmlShownAbove);
var serializer = new XmlSerializer(typeof(Response));
var instance = (Response)serializer.Deserialize(reader);

以下两种模式:

[XmlRoot("Response", Namespace="http://Microsoft.LobServices.Sap/2007/03/Rfc/")]
public class Response
{
    [XmlArray("E_ARR", Namespace="")]
    [XmlArrayItem(typeof(ITEM), ElementName = "ITEM", Namespace="http://Microsoft.LobServices.Sap/2007/03/Types/Rfc/")]
    public ITEM[] E_ARR{ get; set; }
}

public class ITEM
{
    [XmlElement(Namespace = "")]
    public string PROPA{ get; set; }

    [XmlElement(Namespace = "")]
    public string PROPB{ get; set; }
}

不幸的是,此代码没有正确地反序列化E_ARR - 数组 - 它始终保持null并且我无法弄清楚原因。我想这很简单,但我没有看到它 - 提前感谢!

2 个答案:

答案 0 :(得分:4)

您的课程与您的XML完全匹配。您的E_ARR元素继承了其父级的默认命名空间,因此命名空间实际上是http://Microsoft.LobServices.Sap/2007/03/Rfc/。这同样适用于PROPAPROPB。只需添加正确的命名空间即可解决您的问题:

[XmlRoot("Response", Namespace="http://Microsoft.LobServices.Sap/2007/03/Rfc/")]
public class Response
{
    [XmlArray("E_ARR", Namespace = "http://Microsoft.LobServices.Sap/2007/03/Rfc/")]
    [XmlArrayItem(typeof(ITEM), ElementName = "ITEM", Namespace="http://Microsoft.LobServices.Sap/2007/03/Types/Rfc/")]
    public ITEM[] E_ARR{ get; set; }
}

public class ITEM
{
    [XmlElement(Namespace = "http://Microsoft.LobServices.Sap/2007/03/Types/Rfc/")]
    public string PROPA{ get; set; }

    [XmlElement(Namespace = "http://Microsoft.LobServices.Sap/2007/03/Types/Rfc/")]
    public string PROPB{ get; set; }
}

或者,正如Chris在评论中指出的那样,省略名称空间具有相同的效果 - 父项的名称空间是继承的;

[XmlRoot("Response", Namespace = "http://Microsoft.LobServices.Sap/2007/03/Rfc/")]
public class Response
{
    [XmlArray("E_ARR")]
    [XmlArrayItem(typeof (ITEM), ElementName = "ITEM", Namespace = "http://Microsoft.LobServices.Sap/2007/03/Types/Rfc/")]
    public ITEM[] E_ARR { get; set; }
}

public class ITEM
{
    [XmlElement]
    public string PROPA { get; set; }

    [XmlElement]
    public string PROPB { get; set; }
}

答案 1 :(得分:1)

您可以添加

   <system.diagnostics>
      <switches>
         <add name="XmlSerialization.Compilation" value="1" />
      </switches>
   </system.diagnostics>

到您的应用程序配置文件,它将生成的XML序列化代码文件转储到您的临时文件夹。使用这些文件,您可以调试整个序列化过程并逐步完成代码。

手动删除所有命名空间后,您是否尝试过解析文件?命名空间是XML处理中最痛苦的部分。