无法在 C# 中反序列化 XML

Unable to Deserialize XML within C#

我在尝试反序列化以下 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-Array - 它始终保持 null,我不明白为什么。我想这很简单,但我没有看到它 - 在此先感谢!

您可以添加

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

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

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

您的 类 与您的 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; }
}