根据子元素(LINQ to XML)的存在获取XML属性值的列表

本文关键字:XML 获取 存在 属性 列表 元素 LINQ to | 更新日期: 2023-09-27 18:26:55

抱歉,在初稿中,我没有意识到我需要标记代码部分,因此它们被删除了,没有多大意义。固定的

下面是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>中是否至少有一个<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吗?

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

根据子元素(LINQ to XML)的存在获取XML属性值的列表

如果我理解正确,您正试图弄清楚L1Module元素的fees元素中是否包含fees元素?下面的片段应该会为您指明正确的方向。

        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);

不知道你说"…至少有一个元素。这个例子有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);