我在尝试反序列化以下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
并且我无法弄清楚原因。我想这很简单,但我没有看到它 - 提前感谢!
答案 0 :(得分:4)
您的课程与您的XML完全匹配。您的E_ARR
元素继承了其父级的默认命名空间,因此命名空间实际上是http://Microsoft.LobServices.Sap/2007/03/Rfc/
。这同样适用于PROPA
和PROPB
。只需添加正确的命名空间即可解决您的问题:
[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处理中最痛苦的部分。