使用linq to xml挑出一组项目

时间:2011-07-04 12:55:01

标签: c# vb.net linq-to-xml

我的脑袋里充满了这种感觉。我有一个xml doc,其中包含存储在其中的网格的布局。如果您注意到列在XML中存储为“Items”。我正在尝试使用LINQ从XML中检索每个“Item”,但无论我做什么,我都会继续使用我不需要的straggler属性。任何帮助将不胜感激。

  <?xml version="1.0" encoding="utf-16" ?> 
     <DatagridView>
        <ViewType>DevExpress.XtraGrid.Views.Grid.GridView</ViewType> 
           <ViewLayout> 
             <property name="Columns" iskey="true" value="9">
                <property name="Item1" isnull="true" iskey="true">
                   <property name="VisibleIndex">0</property> 
                   <property name="Visible">true</property> 
                   <property name="Width">1249</property> 
                   <property name="SummaryItem" isnull="true" iskey="true">
                      <property name="SummaryType">Count</property> 
                      <property name="DisplayFormat">{0}</property> 
                      <property name="FieldName">Comments</property> 
                      <property name="Tag" isnull="true" /> 
                   </property>
                   <property name="Name">colComments</property> 
                   <property name="ColumnEditName" /> 
                   <property name="FieldName">Comments</property> 
                </property>
                <property name="Item2" isnull="true" iskey="true">
                   <property name="VisibleIndex">1</property> 
                   <property name="Visible">true</property> 
                   <property name="Width">197</property> 
                   <property name="Name">colEvent</property> 
                   <property name="ColumnEditName" /> 
                   <property name="FieldName">Event</property> 
                </property>
                ......

编辑:

要清楚,XML可以包含任意数量的列,如下所示:

            <property name="Item2" isnull="true" iskey="true">
               <property name="VisibleIndex">1</property> 
               <property name="Visible">true</property> 
               <property name="Width">197</property> 
               <property name="Name">colEvent</property> 
               <property name="ColumnEditName" /> 
               <property name="FieldName">Event</property> 
            </property>

我想通过XML以相同的顺序获取那些数据块。

1 个答案:

答案 0 :(得分:2)

好吧,你可以直接在“Columns”下面获取的属性元素

// TODO: Work out what to do if there are zero or multiple such elements
var columns = xdoc.Descendants("property")
                  .Where(x => (string) x.Attribute("name") == "Columns")
                  .Single();

var items = columns.Elements("property");

foreach (var item in items)
{
    Console.WriteLine("Item {0}", (string) item.Attribute("name"));
    foreach (var property in items.Elements("property"))
    {
        Console.WriteLine("  {0} = {1}", (string) item.Attribute("name"),
                          (string) item);
    }
}