Перебрать все атрибуты узла, используя XDocument - PullRequest
2 голосов
/ 06 июня 2011

У меня есть следующий xml, в котором хранятся определения таблиц. Как я могу перебрать каждый столбец переданного имени таблицы (только одно вхождение каждой таблицы) и их атрибуты, используя XDocument (C # 3.5)

Пример: если пользователь передает CurrencySummary, я хочу прочитать каждый столбец и все его атрибуты, такие как HeaderDescription, HeaderName и т. Д.

<?xml version="1.0" encoding="utf-8" ?>
<TableDef>
  <CurrencySummary>
    <Column Name="Currency" HeaderDescription="Currency" HeaderName="Currency" ColumnType="TableColumnType.Text" IsHidden = "false" Position="0" Width="100" />
    <Column Name="ParamortizedValue" HeaderDescription="Par/amortized value" HeaderName="paramortizedvalue" ColumnType="TableColumnType.Number" IsHidden = "false" Position="1" Width="200" />
    <Column Name="PercentBondTotal" HeaderDescription="% of bond total" HeaderName="percentbondtotal" ColumnType="TableColumnType.Number" IsHidden = "false" Position="2" Width="150" />
  </CurrencySummary>
  <CallSchedule>
    <Column Name="Calldate" HeaderDescription="Call date" HeaderName="Calldate" ColumnType="TableColumnType.Text" IsHidden = "false" Position="0" Width="100" />
    <Column Name="Issue" HeaderDescription="Issue" HeaderName="Issue" ColumnType="TableColumnType.Text" IsHidden = "false" Position="1" Width="100" />
    <Column Name="ParamortizedValue" HeaderDescription="Par/amortized value" HeaderName="paramortizedvalue" ColumnType="TableColumnType.Number" IsHidden = "false" Position="2" Width="200" />
    <Column Name="PercentBondTotal" HeaderDescription="% of bond total" HeaderName="percentbondtotal" ColumnType="TableColumnType.Number" IsHidden = "false" Position="3" Width="150" />
  </CallSchedule>
</TableDef>

Я пытаюсь достичь этого путем: (отредактировано: согласно предложению Хенка)

var doc = XDocument.Load("TableDefinations.xml");
var cols = doc.Descendants("CurrencySummary").First();
foreach (var col in cols.Elements())
{
    foreach (XAttribute at in col.Attributes())
    {
        //do something with the at.Name and at.Value
    }
}

Это эффективный способ или есть что-то лучше этого?

Ответы [ 2 ]

5 голосов
/ 06 июня 2011

РЕДАКТИРОВАТЬ OP не на .Net 4, поэтому не использовать SelectMany, если Single() не .Net 4.0 заменить на First()

Похоже, вы должны быть толькоone "CurrencySummary" so ...

var doc = XDocument.Load("TableDefinations.xml");
foreach(XElement col in doc.Descendants("CurrencySummary").Single().Elements())
{
    foreach(XAttribute at in col.Attributes())
    {
        at...
    }
}

Перебирает все атрибуты всех элементов в одном и единственном элементе CurrencySummary, где угодно в TableDefnination.xml.

5 голосов
/ 06 июня 2011

Это немного зависит от того, сколько <CurrencySummary> s существует и имеет ли значение их место.

var summ = doc.Descendants("CurrencySummary").First();

foreach (var col in summ.Elements())
   ...
...