2015-12-14 102 views
0

初稿的道歉,我没有意识到我需要标记代码的部分,因此他们被退出让它没有多大意义。固定。基于子元素的存在获取XML属性值列表(LINQ to XML)

下面是使用所有属性来指定值的XML代码片段。在主XML中,有很多<L1Module>元素,我刚刚在这里复制了1个。其中一些将有<fee>元素,有些甚至不会以<fee/>的形式存在。

<L1Module moduleCode="CFINCEX-101" moduleTypeCode="OPTIONAL" moduleInstanceID="CFINCEX-101_906376" moduleTypeDescription="Optional" credits="0" quota="999" placesLeft="985"> 
<fees> 
<fee feesCategory="STANDARD" feesDescription="Standard Category for Fees" feesAmount="10"/> 
<fee feesCategory="STANDARD" feesDescription="Standard Category for Fees" feesAmount="86"/> 
</fees> 
<documents/> 
<roles/> 
<L2Modules/> 
</L1Module> 

主要是我要看看有没有在每个<L1Module>元素的至少1 <fee>存在与否。我通过<L1Module>的这样循环..

var elements = course_structureXML.Descendants("L1Module").Where(i => i.Value == ""); 
     foreach (var element in elements) 
     { 
      check to see if there's a fee element 
      if there is do something 
      else do nothing 
     } 

我只是有一个很难用眼看,如果有一个收费元素。我是否应该这样循环穿过L1Module

希望这个更清楚一点。再次感谢。

+0

“大部分的例子在那里面对的元素值”意味着你可以找到一些例子处理属性 – Eser

+0

你所说的“L1Module元素*有至少1个元素*”意思?你的意思是*有任何子XML元素*?或者你的意思是更具体的? – dbc

+0

对不起,L1Module元素至少有1个费用元素。 不知道当我把括号放在它周围时它会被剪掉。 – mkorolenko

回答

0

如果我理解正确,你正在试图找出一个L1Module元素是否有收费元素的内部费用元素?下面的代码段应该指向正确的方向。

 String xmlWithFees = "<L1Module moduleCode=\"CFINCEX-101\" moduleTypeCode=\"OPTIONAL\" moduleInstanceID=\"CFINCEX-101_906376\" moduleTypeDescription=\"Optional\" credits=\"0\" quota=\"999\" placesLeft=\"985\">\n" + 
         "<fees>\n" + 
         "<fee feesCategory=\"STANDARD\" feesDescription=\"Standard Category for Fees\" feesAmount=\"10\"/>\n" + 
         "<fee feesCategory=\"STANDARD\" feesDescription=\"Standard Category for Fees\" feesAmount=\"86\"/>\n" + 
         "</fees>\n" + 
         "<documents/>\n" + 
         "<roles/>\n" + 
         "<L2Modules/>\n" + 
         "</L1Module>"; 

     String xmlWithoutFees = "<L1Module moduleCode=\"CFINCEX-101\" moduleTypeCode=\"OPTIONAL\" moduleInstanceID=\"CFINCEX-101_906376\" moduleTypeDescription=\"Optional\" credits=\"0\" quota=\"999\" placesLeft=\"985\">\n" + 
      "<fees/>\n" + 
      "<documents/>\n" + 
      "<roles/>\n" + 
      "<L2Modules/>\n" + 
      "</L1Module>"; 

     XDocument document = XDocument.Parse(xmlWithFees); 
     var l1module = document.Elements("L1Module").Where(el => el.HasElements); 
     var fees = l1module.Elements("fees"); 
     bool hasFees = fees.Elements("fee").Any(); 
     // Will print true 
     Console.WriteLine("Has fees? " + hasFees); 

     document = XDocument.Parse(xmlWithoutFees); 
     l1module = document.Elements("L1Module").Where(el => el.HasElements); 
     fees = l1module.Elements("fees"); 
     hasFees = fees.Elements("fee").Any(); 
     // Will print false 
     Console.WriteLine("Has fees? " + hasFees); 
0

当你说“...至少有一个元素,这个例子有2 ...”时,不确定你的意思,因为这个例子有两个以上的元素。这应该足以让你去,但:

string xml = @"<L1Module moduleCode=""CFINCEX-101"" 
         moduleTypeCode=""OPTIONAL"" 
         moduleInstanceID=""CFINCEX-101_906376"" 
         moduleTypeDescription=""Optional"" 
         credits=""0"" 
         quota=""999"" 
         placesLeft=""985""> 
        <fees> 
         <fee feesCategory=""STANDARD"" 
          feesDescription=""Standard Category for Fees"" 
          feesAmount=""10""/> 
         <fee feesCategory=""STANDARD"" 
          feesDescription=""Standard Category for Fees"" 
          feesAmount=""86""/> 
        </fees> 
        <documents/> 
        <roles/> 
        <L2Modules/> 
       </L1Module>"; 

var document = XDocument.Parse(xml); 
var l1Modules = document.Elements("L1Module") 
         .Where(el => el.HasElements); 

foreach (var l1module in l1Modules) 
    Console.WriteLine(l1module.Attribute("moduleCode").Value); 
+0

对不起,我不仅是一个LINQ noobie我也是这个网站上的一员,并且我没有在描述中识别代码段,并且他们被删除了。我重新编辑它希望更有意义。 – mkorolenko

相关问题