Прочитайте родительские узлы только из XML с использованием linqtoxml

StackOverflow https://stackoverflow.com/questions/2542534

  •  23-09-2019
  •  | 
  •  

Вопрос

У меня есть строка XML, которая имеет родительские узлы «комитет», и внутри этого есть еще один детский комитет «комитет». Когда я использую "from committee in xDocument.DescendantsAndSelf("Committee")«Это также чтение ChildNode, но я не хочу читать детские узлы, я просто хочу читать только родительские узлы.

<Committee>
  <Position>STAFF</Position>
  <Appointment>1/16/2006</Appointment>
  <Committee>PPMSSTAFF</Committee>
  <CommitteeName>PPMS Staff</CommitteeName>
  <Expiration>12/25/2099</Expiration>      
</Committee>
<Committee>
   <Position>STAFF</Position>
  <Appointment>4/16/2004</Appointment>
  <Committee>PMOSSTAFF</Committee>
  <CommitteeName>PPMS </CommitteeName>
  <Expiration>12/25/2099</Expiration>
</Committee>

     XElement xDocument= XElement.Parse(xml);

 var committeeXmls = from Committee in xDocument.Descendants("Committee")
                                select new
                                {
                                    CommitteeName = Committee.Element("CommitteeName"),
                                    Position = Committee.Element("Position"),
                                    Appointment = Committee.Element("Appointment"),
                                    Expiration = Committee.Element("Expiration")
                                };

            int i = 0;
            foreach (var committeeXml in committeeXmls)
            {
                if (committeeXml != null)
                {
                    drCommittee = dtCommittee.NewRow();
                    drCommittee["ID"] = ++i;
                    drCommittee["CommitteeName"] = committeeXml.CommitteeName.Value;
                    drCommittee["Position"] = committeeXml.Position.Value;
                    drCommittee["Appointment"] = committeeXml.Appointment.Value;
                    drCommittee["Expiration"] = committeeXml.Expiration.Value;

                    dtCommittee.Rows.Add(drCommittee);                                        //   educationXml.GraduationDate.Value, educationXml.Major.Value);
                }
            }

Нет правильного решения

Другие советы

Использовать Elements Метод вместо Descendants.

Измените это:

from Committee in xDocument.Descendants("Committee")

К этому:

from Committee in xDocument.Elements("Committee")

Это вернет ребенка Committee элементы текущего элемента (xDocument переменная).

Вы можете использовать метод расширения xPathSelectelements (в System.xml.xpath пространство имен), чтобы выбрать только те элементы комитета, которые имеют детский элемент комитета.

var committeeXmls = from Committee in xDocument.XPathSelectElements("Committee[Committee]")
                    ...
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top