将XML转换为某些列表

时间:2012-04-27 08:46:35

标签: c# xml linq api linq-to-objects

我有一个来自我的php网站的xml文件作为api。

这是从我的php应用程序返回的xml。

<xml>
<overzicht>
<item>
<sessieID>6</sessieID>
<onderwerp>Vrijwilligers, een uitstervend rasnn</onderwerp>
<omschrijving>Ode aan de vrijwilligers jjj</omschrijving>
<sprekerID>1</sprekerID>
<lokaalID>20</lokaalID>
<themaID>1</themaID>
<typeID>2</typeID>
<periodeID>2</periodeID>
<datum>2012-02-20</datum>
<maximaleInschrijvingen>1</maximaleInschrijvingen>
<spreker>
    <sprekerID>1</sprekerID>
    <sprekerNaam>Rik Torfs</sprekerNaam>
    <loginID>13</loginID>
</spreker>
<lokaal>
    <lokaalID>20</lokaalID>
    <campusNaam>Malle</campusNaam>
    <lokaalOpCampus>W10</lokaalOpCampus>
    <typeID>2</typeID>
</lokaal>
</item>
<item>
<sessieID>15</sessieID>
<onderwerp>VPKB</onderwerp>
<omschrijving/>
<sprekerID>6</sprekerID>
<lokaalID>2</lokaalID>
<themaID>1</themaID>
<typeID>1</typeID>
<periodeID>2</periodeID>
<datum>2012-02-20</datum>
<maximaleInschrijvingen>50</maximaleInschrijvingen>
<spreker>
    <sprekerID>6</sprekerID>
    <sprekerNaam>Dick Wursten</sprekerNaam>
    <loginID>18</loginID>
</spreker>
<lokaal>
    <lokaalID>2</lokaalID>
    <campusNaam>KHK Vorselaar</campusNaam>
    <lokaalOpCampus>A102</lokaalOpCampus>
    <typeID>1</typeID>
</lokaal>
</item>
...
</overzicht>
</xml>

这是我的C#代码。我想得到Sessie的名单。

XDocument xmlDoc = XDocument.Parse(e.Result);
List<Sessie> sessies = 
    (
        from item in xmlDoc.Descendants("overzicht")
        select new Sessie(
                item.Element("onderwerp").Value,
                Convert.ToInt32(item.Element("sessieID").Value),
                item.Element("omschrijving").Value,
                (Spreker)(
                            new Spreker(
                                Convert.ToInt32(item.Element("spreker").Element("sprekerID").Value), 
                                item.Element("spreker").Element("sprekernaam").Value)
                        ),
                Convert.ToDateTime(item.Element("datum").Value),
                Convert.ToInt32(item.Element("maximaleInschrijvingen").Value),
                (Lokaal)(
                            new Lokaal(
                                Convert.ToInt32(item.Element("lokaal").Element("lokaalID").Value), 
                                item.Element("lokaal").Element("campusNaam").Value, 
                                item.Element("lokaal").Element("lokaalOpCampus").Value)
                        )
                )
    ).ToList<Sessie>();

我知道我的代码无法处理此异常。

“的NullReferenceException”

2 个答案:

答案 0 :(得分:3)

开始时有一个相当明显的问题。查看查询的开头:

from item in xmlDoc.Descendants("overzicht")
select new Sessie(item.Element("onderwerp").Value,
...

只有在<onderwerp>下直接<overzicht>时才会有效。没有 - 它在<item>元素之下。也许(给定范围变量名称)你的意思是:

from item in xmlDoc.Descendants("item")
select new Sessie(item.Element("onderwerp").Value,
...

答案 1 :(得分:2)

查询

 from item in xmlDoc.Descendants("overzicht")

将返回<overzicht>个元素的列表。 item.Element("onderwerp")不存在,您错过了<item>元素。

简单修复:

 from item in xmlDoc.Descendants("item")