2017-02-28 50 views
0

假设我有以下XML格式。使用选择内的选择

<data> 
    <appName>Microsoft Word</appName> 
    <appId>123</appId> 
</data> 

在XML中有多个数据树的地方,我有以下代码来构建数据对象列表。

List<DataObj> dataObjList = 
    (
     from dataNode in xmlDoc.Elements("data") 
     select new DataObj 
     { 
      appName = dataNode.Element("appName"), 
      appId = dataNode.Element("appId") 
     } 
    ).ToList(); 

不过,我遇到了问题,如果我增加一个额外的树中的数据标签下,像这样:

<data> 
    <appName>Microsoft Word</appName> 
    <appId>123</appId> 
    <appOptions> 
      <Win7Compat>true</Win7Compat> 
      <Win7x64Compat>false</Win7x64Compat> 
    </appOptions> 
</data> 

我使用下面的代码:

List<DataObj> dataObjList = 
    (
     from dataNode in xmlDoc.Elements("data") 
     select new DataObj 
     { 
      appName = dataNode.Element("appName"), 
      appId = dataNode.Element("appId") 
      appOptions = 
      (
       from appNode in dataNode.Elements("appOptions") 
       select new AppOptionsObj 
       { 
        win7Compat = appNode.Element("Win7Compat"), 
        win7x64Compat = appNode.Element("Win7x64Compat") 
       } 
      ) as AppOptionsObj, 
     } 
    ).ToList(); 

我的appOptions对象始终被视为null。我有一种感觉,我没有正确解析子树。

+0

它不应该是'从appNode在dataNode.Element(“appOptions”)'(单)?另外,您发布的内容不是有效的XML。 'Win7Compat'和下一个兄弟没有关闭。 –

+0

我不相信这是你运行的代码 - 这里有明确的语法错误和拼写错误。如果您需要帮助,您必须向我们展示您正在使用的代码。发布的代码只会给出一堆错误。 – Hogan

+0

你为什么不简单地将这个XML反序列化为一个对象? –

回答

2

的问题是,你与as AppOptionsObj但你Select铸造真的返回在null一个IEnumerable<AppOptionsObj>所以投的结果。你可能想使用SingleOrDefault()返回单一实例,而不是:

List<DataObj> dataObjList = 
    (
     from dataNode in xmlDoc.Elements("data") 
     select new DataObj 
     { 
      appName = dataNode.Element("appName"), 
      appId = dataNode.Element("appId") 
      appOptions = 
      (
       from appNode in dataNode.Elements("appOptions") 
       select new AppOptionsObj 
       { 
        win7Compat = appNode.Element("Win7Compat"), 
        win7x64Compat = appNode.Element("Win7x64Compat") 
       } 
      ).SingleOrDefault(), 
     } 
    ).ToList(); 
+0

工作完美!非常感谢。 – LeoVannini