2015-08-28 2 views
0

У меня есть ниже XML в файле описаний данных:Получить Имя атрибута, используя позицию из XElement

<PQTemplate documentID="CSTrlsEN" documentType="TransList" templateID="001" 
      templateType="Customer Copy" 
      templateName="C:\CPS\_templates\Mini-Statements\CSTrlsEN.doc"> 
    <field pos="5" name="YPTME" descr="Time" /> 
    <field pos="6" name="YPDTE" descr="Action Date" /> 
    <field pos="7" name="YPBRNO" descr="Branch Number" /> 
    <field pos="8" name="YPBNA" descr="Branch Name" /> 
    <field pos="9" name="YPTID" descr="Teller ID" /> 
    <field pos="10" name="YPISN" descr="Teller Sequence" /> 
    <field pos="11" name="YPREF" descr="Customer Reference" /> 
    <field pos="12" name="YPCUS" descr="Customer Name" /> 
    <field pos="13" name="YPEAN" descr="Account Number" /> 
    <field pos="14" name="YPATY" descr="Account Type" /> 
    <field pos="15" name="YPCUR" descr="Currency" /> 
    <field pos="16" name="YPBAL" descr="Available Balance" /> 
</PQTemplate> 

Я хочу построить таблицу данных путем добавления столбцов с именем для имя атрибута в поле подэлементы, но у меня возникли проблемы с извлечением информации с помощью LINQ:

Вот код, который я пытаюсь написать, я хочу, чтобы добавить имя столбца с именами атрибутов, где атрибут поз является> 5 , поэтому пихта й столбец будет YPTME, второй столбец будет YPDTE, и так далее до 12-го и последнего столбца добавленным будет YPBAL ...

var mapInfo = from nm in XElement.Elements("PQTemplate").Elements("field") 
       where (string)nm.Attribute("documentID") == sRequests[0] 
       select nm; 

if (mapInfo != null) 
{ 
    for (int iCol = 5; iCol < mapInfo.Count(); iCol++) 
    { 
     // there should be twelve 
     string colName = mapInfo.Attributes(iCol); 
     dt[0].Columns.Add(new DataColumn(colName, typeof(System.String))); 
    } 
} 

Я, кажется не в состоянии сделать это правильно, как я могу это сделать и где я буду неправильно с линией string colName = mapInfo.Attributes(iCol);

EDIT:

Я также попытался это, но опять же, не могу показаться, что ар сгибают индексирование в for..next цикле:

var mapInfo = from nm in XElement.Elements("PQTemplate").Elements("field") 
      where (string)nm.Attribute("documentID") == sRequests[0] && Convert.ToInt32(nm.Attribute("pos").ToString())>=5 
      orderby Convert.ToInt32(nm.Attribute("pos").ToString()) 
      select nm; 

if (mapInfo != null) 
{ 
    for (int iDx=5; iDx<mapInfo.Count(); iDx++) 
    { 
    string colName=mapInfo[iDx]; 
    dt[0].Columns.Add(new DataColumn(colName, typeof(System.String))); 
      } 
    } 

Благодаря

ответ

1

попробовать этот

 XElement rootElement = XElement.Parse(stringXml); 
     DataTable dt = new DataTable(); 
     if (rootElement.Attribute("documentID").Value == "CSTrlsEN") 
     { 
      var colNames = from field in rootElement.Elements("field") 
          where Convert.ToInt32(field.Attribute("pos").Value) >= 5 
          select field.Attribute("name").Value; 

      foreach (var name in colNames) 
      { 
       dt.Columns.Add(name, typeof(string)); 
      } 
     } 
+0

Спасибо, но мне нужно, чтобы добавить их к DataTable в порядке 'pos' атрибута ... –

+1

обновил решение! –

1

Это должно работать для вас: -

IEnumerable<string> columnNames = from nm in xdoc.Descendants("field") 
          where (string)nm.Parent.Attribute("documentID") == "CSTrlsEN" 
               && (int)nm.Attribute("pos") >= 5 
          select (string)nm.Attribute("name"); 

Или, если вы хотите сделать валидация для documentID вы можете использовать блок if раньше, как предложено @codeninja.

Это даст вам все имена столбцов с заданным условием, то вы можете просто цикл через него: -

foreach (var colName in columnNames) 
{ 
    dt[0].Columns.Add(new DataColumn(colName, typeof(System.String))); 
} 
+1

, хотя это выглядит просто, вы заставили пользователя проверить идентификатор документа для каждой итерации. Нежелательно !!! –

+1

@codeninja - Соглашайтесь с вами, хотя он будет проходить каждый раз, когда мы сможем пропустить проверку. –

Смежные вопросы