我目前正在开发.NET 4.6控制台应用程序。我需要从URL解析嵌套的XML并将XML转换为对象列表。
示例XML的URL如下:
https://www.w3schools.com/xml/cd_catalog.xml
XML看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Hide your heart</TITLE>
<ARTIST>Bonnie Tyler</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS Records</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR>
</CD>
</CATALOG>
我对应的C#类看起来像这样:
[XmlRoot(ElementName = "CATALOG")]
public class Catalog
{
[XmlElement("CD")]
List<Cd> Cds { get; set; }
}
[XmlRoot(ElementName = "CD")]
public class Cd
{
[XmlElement("TITLE")]
public string Title { get; set; }
[XmlElement("ARTIST")]
public string Artist { get; set; }
[XmlElement("COUNTRY")]
public string Country { get; set; }
[XmlElement("COMPANY")]
public string Company { get; set; }
[XmlElement("PRICE")]
public double Price { get; set; }
[XmlElement("YEAR")]
public int Year { get; set; }
}
我的程序类看起来像这样:
class Program
{
static void Main(string[] args)
{
Init();
}
public static void Init() {
var url = "https://www.w3schools.com/xml/cd_catalog.xml";
XmlDocument myXmlDocument = new XmlDocument();
myXmlDocument.Load(url);
var catalog = myXmlDocument.InnerXml.ToString();
var result = Deserialize<Catalog>(catalog);
// result is null :(
Console.ReadKey();
}
public static T Deserialize<T>(string xmlText)
{
try
{
var stringReader = new StringReader(xmlText);
var serializer = new XmlSerializer(typeof(T));
return (T)serializer.Deserialize(stringReader);
}
catch (Exception ex)
{
throw;
}
}
}
到目前为止,我的变量目录由XML字符串组成,但不知何故,XML无法正确解析。我总是得到null作为返回结果。也许是因为我的班级定义。
您如何看待,您对如何解决此问题有所了解吗?要检索List<Cd>
而不是null。
答案 0 :(得分:2)
错误非常微妙。您已完成所有操作,但您错过了在public
课程中添加Catalog
访问限定符,在Cd
列表中添加如下:
[XmlRoot(ElementName = "CATALOG")]
public class Catalog
{
[XmlElement("CD")]
public List<Cd> Cds { get; set; }
}
由于访问限定符默认为private
,因此反序列化器很难找到正确的属性来将XML反序列化。
答案 1 :(得分:0)
List<Cd> Cds { get; set; }
将此行更改为
Public List<Cd> Cds { get; set; }