2012-06-14 4 views
1

Извините, если мой вопрос неясен. Я получил кучу элементов и атрибуты для каждого из них из xDocument. Теперь я хочу, чтобы на каждой итерации получалось больше дециентов каждого узла, итерация через них и получение всех их атрибутов.Получение дочерних узлов элемента xDocument при его выполнении через Xdocument

структура:

<Jobs> 
    <Job attr1=val1 attr2=val2 attr3=val3> 
      <InnerNode1 InnerAttr1=val6 InnerAttr2=7> 
        <InnerNodeChild1> 
         ......... 
        </InnerNodeChild1> 
        <InnerNodeChild2> 
         ............ 
        </InnerNodeChild2> 
        <InnerNodeChild3> 
         ....... 
        </InnerNodeChild3> 
      </InnerNode1> 
      <InnerNode2 InnerAttr1=val6 InnerAttr2=7> 
        <InnerNodeChild1> 
         ......... 
        </InnerNodeChild1> 
        <InnerNodeChild2> 
         ............ 
        </InnerNodeChild2> 
        <InnerNodeChild3> 
         ....... 
        </InnerNodeChild3> 
      </InnerNode2> 
      <InnerNode3 InnerAttr1=val6 InnerAttr2=7> 
        <InnerNodeChild1> 
         ......... 
        </InnerNodeChild1> 
        <InnerNodeChild2> 
         ............ 
        </InnerNodeChild2> 
        <InnerNodeChild3> 
         ....... 
        </InnerNodeChild3> 
      </InnerNode3> 
    </job> 
    <Job attr1=val4 attr2=val5> 
      <InnerNode1 InnerAttr1=val6 InnerAttr2=7> 
        <InnerNodeChild1> 
         ......... 
        </InnerNodeChild1> 
        <InnerNodeChild2> 
         ............ 
        </InnerNodeChild2> 
        <InnerNodeChild3> 
         ....... 
        </InnerNodeChild3> 
      </InnerNode1> 
      <InnerNode2 InnerAttr1=val6 InnerAttr2=7> 
        <InnerNodeChild1> 
         ......... 
        </InnerNodeChild1> 
        <InnerNodeChild2> 
         ............ 
        </InnerNodeChild2> 
        <InnerNodeChild3> 
         ....... 
        </InnerNodeChild3> 
      </InnerNode2> 
      <InnerNode3 InnerAttr1=val6 InnerAttr2=7> 
        <InnerNodeChild1> 
         ......... 
        </InnerNodeChild1> 
        <InnerNodeChild2> 
         ............ 
        </InnerNodeChild2> 
        <InnerNodeChild3> 
         ....... 
        </InnerNodeChild3> 
      </InnerNode3> 
    </Job> 
    ..... 
    ..... 
    ..... 
    <OtherNodeInSameLevelAsJob> 
    </OtherNodeInSameLevelAsJob> 
</Jobs> 

OK, для каждого работы узла будет только один InnerNode1 и имеет атрибуты и внутренние узлы это сам. Если я хочу получить все атрибуты и InnerNodeChilds из каждого InnerNode1, но во время выполнения заданий, как в следующем примере, что мне нужно сделать?

XDocument xDoc = XDocument.Load(xDr); 
      var Jobs = from Job in xDoc.Descendants("Job") 
         select new { 
          JobID = Job.Attribute("JobID").Value, 
          JobName = Job.Attribute("JobName").Value, 
          ........ 
          ........ 
          ........ 
         }; 

, а затем:

foreach(var Job in Jobs){ 
     string JobId = Job.JobID; 
     string JobName = job.JobName; 
     ......... 
     ......... 
     ......... 
} 

Спасибо, Эрез

+0

Просто, чтобы быть уверенным. Вам нужен список «Jobs» с только атрибутами, InnerNode1 и InnerNode1? – Mualig

ответ

3

Получение каждый InnerNode1 очень просто, вы просто позвоните .Descendants("InnerNode1") и вы будете иметь список каждого из них. Вот пример, который может сработать для вас. Я вызываю родителя на узле, чтобы получить его имя и идентификатор работы.

var innerchilds = xDoc.Descendants("InnerNode1").Select(x => new { 
    JobID = x.Parent.Attribute("JobID").Value, 
    JobName = x.Parent.Attribute("JobName").Value, 
    ... 
    }); 
1

Вы означая выберите внутри отборное?

var Jobs = from Job in xDoc.Descendants("Job") 
        select new { 
         JobID = Job.Attribute("JobID").Value, 
         JobName = Job.Attribute("JobName").Value, 
         InnerNode = from inner in Job.Elements("InnerNode") 
          select new 
          { 
           Name = inner.Attribute("Name") 
          } 
         ........ 
         ........ 
         ........ 
        }; 
+0

Эй, это было здорово, спасибо, но у меня все еще есть проблема с этим .... В вашем ответе вы возвращаете xelement, названный inner, и для каждого внутреннего получили его атрибуты. Мне нужно получить Внутренний ребенок из каждого внутреннего и к его атрибутам ... Я знаю, что это должно быть прямолинейным, просто сделайте еще один выбор, но выберите дочерний элемент child, возвращающий пустую или пустую строку, и я получаю исключение все время при попытке использовать его ... как я показал ранее, внутренние ноды и внутренние фигуры не всегда равны числу братьев и сестер и даже иногда пустуют. и подумал об этом? 10x :-) – Erez

+0

Я рад, что это помогло! Возможно, посмотрите и на это: http://stackoverflow.com/questions/4989686/how-to-iterate-through-an-xdocuments-nodes –

+0

Вы всегда можете выполнить проверку ошибок внутри выбора. Например, замените Job.Attribute ("JobName") на: Job.Attribute ("JobName") == null? string.Empty: Job.Attribute ("JobName"). Значение –

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