从URL解析嵌套XML

时间:2017-11-13 13:46:31

标签: c# asp.net .net xml

我目前正在开发.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。

2 个答案:

答案 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; }