无法在 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/
。这同样适用于 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; }
}
我在尝试反序列化以下 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/
。这同样适用于 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; }
}