如何从XML中的特定元素中查找元素/属性列表?

时间:2013-05-02 15:54:14

标签: c# xml winforms linq-to-xml

如何查询xml文档以返回特定元素的子元素/属性列表。

var entry = from item in doc.Descendants("GROUP")
                        where (string)item.Attribute("meetsMark") == "1"
                        select new
                        {                                
                            code = (string)item.Attribute("code"),                               
                        };

以上仅返回属于GROUP的条目,其中meetMark属性为“1”。对于它返回代码的每个元素,我还需要获得它包含的每个SUMMARY属性的'sum'和'number'列表。 示例:我需要返回查询:

code = SECONDARY

sum = SUM1

number = 1

sum = SUM3

number = 3

sum = SUM4

number = 4

code = THIRD

sum = SUM10

number = 1

sum = SUM30

number = 3

sum = SUM40

number = 4

下面是xml结构。

<GROUP
    id="GRP2"
    code="MAIN"             
    meetsMark="0"

    <GROUP
        id="GRP3"               
        code="SECONDARY"    
        meetsMark="1"

            <ITEMS>
                <ITEM
                    id="ITM6"                           

                    <SUMMARY
                        sum="SUM1"
                        number="1"                                                      

                    </SUMMARY>
                </ITEM>
                <ITEM
                    id="ITM14"                          

                    <SUMMARY
                        sum="SUM3"
                        number="3"                                                      

                    </SUMMARY>                          
                </ITEM>
                <ITEM
                    id="ITM15"                          

                    <SUMMARY
                        sum="SUM4"
                        number="4"                          

                    </SUMMARY>                          
                </ITEM>                     
            </ITEMS>                    
        </GROUP>
        <GROUP
        id="GRP4"               
        code="THIRD"    
        meetsMark="1"

            <ITEMS>
                <ITEM
                    id="ITM95"                          

                    <SUMMARY
                        sum="SUM10"
                        number="1"                                                      

                    </SUMMARY>
                </ITEM>
                <ITEM
                    id="ITM96"                          

                    <SUMMARY
                        sum="SUM30"
                        number="3"                                                      

                    </SUMMARY>                          
                </ITEM>
                <ITEM
                    id="ITM97"                          

                    <SUMMARY
                        sum="SUM40"
                        number="4"                          

                    </SUMMARY>                          
                </ITEM>                     
            </ITEMS>                    
        </GROUP>
</GROUP>            
     

1 个答案:

答案 0 :(得分:0)

这将是这样的......(为清楚起见省略了换行符)

var groups = from group in doc.Descendants("GROUP")
            where (string)group.Attribute("meetsMark") == "1"
            select group

var subgroups = from subgroup in groups.Descendants("GROUP")
           where subgroup.Attribute("code").Value == "SECONDARY"
           select subgroup;

foreach( var subgroup in subgroups )
{
   System.Console.WriteFormat( "code = {0}", subgroup.Attribute("code").Value );

   var sums = from summary in subgroup.Descendants("SUMMARY")

   foreach( var sum in sums )
   {
       System.Console.WriteFormat( "sum = {0}", subgroup.Attribute("sum").Value );
       System.Console.WriteFormat( "number = {0}", subgroup.Attribute("number").Value );
   }
}