无法使用LINQ和XDocument访问元素

时间:2012-06-12 11:39:19

标签: c# asp.net linq linq-to-xml

我有一段xml,我作为Web服务的响应得到了。

 <Production>
    <creator>...</creator>
    <creator.date_of_birth/>
    <creator.date_of_death/>
    <creator.history/>
    <creator.lref>426</creator.lref>
    <creator.qualifier/>
    <creator.role/>
    <creator.role.lref/>
    <production.notes/>
    <production.place>France</production.place>
    <production.place.lref>30</production.place.lref>
  </Production>
  <production.period>19th century</production.period>
  <production.period.lref>13</production.period.lref>
  <Production_date>
    <production.date.end>1863</production.date.end>
    <production.date.end.prec>circa.</production.date.end.prec>
    <production.date.start>1863</production.date.start>
    <production.date.start.prec>dated</production.date.start.prec>
  </Production_date>

以下是获取值的LINQ代码:

allrecs = (from XElement c in recordSet.Descendants("recordList")
                where c.HasElements
                from x in c.Elements("record")
                select new CollectionRecord()
                {
                  production_place =  x.Element("Production").Element("production.place").Value,
                  production_period =  x.Element("production.period").Value,
                  production_start_date = x.Element("Production_date").Element("production.date.start").Value,
                  production_end_date = x.Element("Production_date").Element("production.date.end").Value,
                }).ToList <CollectionRecord>();

我发现的问题是 - 我无法获取“production.date.start”和“production.date.end”的值,但上面的代码适用于“production.period”。 xml结构和这些元素中的数据没有任何问题。根据我的理解,它不适用于任何类似的元素 - “a.b.c”,但它适用于 - “a.b”,因为我已经检查过其他类似的元素而且它不起作用!

1 个答案:

答案 0 :(得分:1)

适合我(我保持你的XLinq代码相同 - 只是交换到new的匿名类型):

[TestMethod]
public void TestMethod1()
{
  XElement x = XElement.Parse(@"<record><Production> 
<creator>...</creator> 
<creator.date_of_birth/> 
<creator.date_of_death/> 
<creator.history/> 
<creator.lref>426</creator.lref> 
<creator.qualifier/> 
<creator.role/> 
<creator.role.lref/> 
<production.notes/> 
<production.place>France</production.place> 
<production.place.lref>30</production.place.lref> 
</Production> 
<production.period>19th century</production.period> 
<production.period.lref>13</production.period.lref> 
<Production_date> 
<production.date.end>1863</production.date.end> 
<production.date.end.prec>circa.</production.date.end.prec> 
<production.date.start>1863</production.date.start> 
<production.date.start.prec>dated</production.date.start.prec> 
</Production_date></record>");
  var rec = new 
              {
                production_place = x.Element("Production").Element("production.place").Value,
                production_period = x.Element("production.period").Value,
                production_start_date = x.Element("Production_date").Element("production.date.start").Value,
                production_end_date = x.Element("Production_date").Element("production.date.end").Value,
              };
  Assert.AreEqual("France", rec.production_place);
  Assert.AreEqual("19th century", rec.production_period);
  Assert.AreEqual("1863", rec.production_start_date);
  Assert.AreEqual("1863", rec.production_end_date);
}

我想知道您的CollectionRecord班级是否正在使用属性,以及您是否为两个违规值正确编写了set方法?

(更新)由于你的get / sets是'标准',它可能就像一段代码那样简单,在某处将这些属性物理地设置为null。