Синтаксический анализ внутреннего XML-тега с использованием C#

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

  •  21-12-2019
  •  | 
  •  

Вопрос

<career code="17-1011.00">
   <code>17-1011.00</code>
   <title>Architects</title>
   <tags bright_outlook="false" green="true" apprenticeship="false" />
   <also_called>
      <title>Architect</title>
      <title>Project Architect</title>
      <title>Project Manager</title>
      <title>Architectural Project Manager</title>
   </also_called>
   <what_they_do>Plan and design structures, such as private residences, office buildings, theaters, factories, and other structural property.</what_they_do>
   <on_the_job>
      <task>Consult with clients to determine functional or spatial requirements of structures.</task>
      <task>Prepare scale drawings.</task>
      <task>Plan layout of project.</task>
   </on_the_job>
</career>

Я взял этот XML, возвращенный из ONet, и хотел бы проанализировать информацию для использования.Вот код, который я написал, чтобы попытаться проанализировать внутренний текст тегов в разделе , где "входными данными" является Onet XML.

 XmlDocument inputXML = new XmlDocument();
        inputXML.LoadXml(input);
        XmlElement root = inputXML.DocumentElement;
        XmlNodeList titleList = root.GetElementsByTagName("also_called");
        for (int i = 0; i < titleList.Count; i++)
        {
            Console.WriteLine(titleList[i].InnerText);
        } 

Я ожидаю получить список узлов четвертого размера.Однако, когда я распечатываю результат, результат имеет размер 1:"Архитектор проекта, менеджер архитектурного проекта, руководитель архитектурного проекта"

Я неправильно сконструировал свой список заголовков XmlNodeList?Как я могу дополнительно просмотреть и обработать дерево XML, чтобы получить внутренние значения тегов 'title' в разделе 'also_called'?

Это было полезно?

Решение

Вы получаете элементы имени also_called.В вашем списке есть только один такой элемент.То, что вы, вероятно, хотите, это получить детей узла also_called.

Например:

XmlNodeList also_calledList = root.GetElementsByTagName("also_called");
XmlNode also_calledElement = also_calledList[0];
XmlNodeList titleList = also_calledElement.ChildNodes;

foreach (XmlNode titleNode in titleList)
{
    Console.WriteLine(titleNode.InnerText);
}
.

Кроме того, рассмотреть возможность использования XDocument и Linq к XML вместо XmlDocument - это намного проще использовать:

XDocument root = XDocument.Parse(input);

foreach (XElement titleNode in root.Descendants("also_called").First().Elements())
{
    Console.WriteLine(titleNode.Value);
}
.

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

Вам просто нужно немного XPath.При этом выбираются все title узлы, которые являются дочерними по отношению к первому also_called.

        XmlDocument inputXML = new XmlDocument();
        inputXML.LoadXml(input);

        foreach(var node in root.SelectNodes("also_called[1]/title"))
        {
            Console.WriteLine(node.InnerText);
        } 

Это редкость, когда вам нужно было бы использовать GetElementsByTagName или ChildNodes и иже с ними и/или попробуйте проверить узел, чтобы выяснить, тот ли это узел, который вам нужен.Навигация по Xml с помощью XmlDocument все дело в использовании XPath с помощью которого вы можете указать совсем немного, когда дело доходит до получения узлов, соответствующих определенным критериям;как с точки зрения структуры внутри дерева, так и с точки зрения содержимого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top