• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

的LINQ to XML动态XML Decendants

c/c++ 来源:antanas_sepikas 6次浏览

我解析了很多使用LINQ to XML synatx XML文件,一切正常,当我尝试访问顶级元素的LINQ to XML动态XML Decendants

var indexroot = (from element in prodcutDocument.Root.Descendants("indexroot") 
         select new 
         { 
          model = (string)element.Element("MODEL"), 
         }).FirstOrDefault() 

当我需要访问下出现的问题该文件我试过的级别孩子的:

var indexroot = (from element in prodcutDocument.Root.Descendants("indexroot") 
         select new 
         { 
          ddName = (string)element.Descendants("DD_NAME").Elements("name").First(); 
          }).FirstOrDefault() 

var indexroot = (from element in prodcutDocument.Root.Descendants("indexroot").Descendants("DD_NAME") 
          select new 
          { 
           ddName = (string)element.Element("name") 
          }).FirstOrDefault(); 

可悲的是没有任何的作品,我也得到同样的错误“序列不包含元素”。还有一件事情,XML文档有时包含这些标签,有时候并不足以处理这种情况。

var indexroot = (from element in prodcutDocument.Root.Descendants("indexroot").Descendants("DD_NAME") 
          select new 
          { 
           ddName = (string)element.Element("name") ?? "-" 
          }).FirstOrDefault(); 

编辑: 我不认为是可能的粘贴XML,这将是简单的短版,所以这里的完整版:http://pastebin.com/uDkP3rnR和代码示例:

XDocument prodcutDocument = XDocument.Load(this.ServerPATHData + file); 

var indexroot = (from element in prodcutDocument.Root.Descendants("indexroot") 
      select new 
      { 
       modelis = (string)element.Element("MODELIS"), 
       T2918_0 = (string)element.Descendants("dd_DARBINIS_GRAFIKAS_SPEC").First() 
      }).FirstOrDefault(); 

writeTxt.WriteLine("modelis: " + indexroot.modelis); 
writeTxt.WriteLine("T2979_0" + indexroot.T2918_0); 


===========解决方案如下:

在检查您在PasteBin上发布的示例XML时,在我看来,您提到的元素只出现一次。要访问它们,你可以按照如下简单地指定到每一个路径:

<code class="prettyprint-override">XElement indexroot = document.Root.Element("indexroot"); 
XElement modelis = indexroot.Element("MODELIS"); 
XElement dd_dgs = indexroot.Element("dd_DARBINIS_GRAFIKAS_SPEC"); 

XElement voltageuv = dd_dgs.Element("VoltageUV"); 

string t2979_0 = (string)voltageuv.Element("T2979_0"); 
string t2861_60 = (string)voltageuv.Element("T2861_60"); 
string t2757_121 = (string)voltageuv.Element("T2757_121"); 
</code>

(请注意,您可能需要检查null如果有机会,任何你正在试图访问可能不是元素。目前没有这样做,你会遇到一个NullReferenceException

这里是你发布给上下文上面的代码中的XML的一个片段:

<code class="prettyprint-override"><?xml version='1.0' encoding='UTF-8' standalone='no'?> 
<PDB> 
    <indexroot> 
    <ed_BENDRA_MAKS_SUV_GALIA>1.45</ed_BENDRA_MAKS_SUV_GALIA> 
    <ed_BENDRA_MAKS_SROVE>6.48</ed_BENDRA_MAKS_SROVE> 
    <TIPAS>1</TIPAS> 
    <MODELIS>RIS 2500 HW EC 3.0</MODELIS> 
    <dd_DARBINIS_GRAFIKAS_SPEC> 
     <VoltageUV> 
     <T2979_0>229,42</T2979_0> 
     <T2861_60>227,98</T2861_60> 
     <T2757_121>228,97</T2757_121> 
     </VoltageUV> 
     <CurrentIA> 
     <T2979_0>2,56</T2979_0> 
     <T2861_60>2,63</T2861_60> 
     <T2757_121>2,72</T2757_121> 
     </CurrentIA> 
    </dd_DARBINIS_GRAFIKAS_SPEC> 
    </indexroot> 
</PDB> 
</code>

版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)