Pergunta

<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>

Peguei esse XML retornado da ONet e gostaria de analisar as informações a serem usadas.Aqui está o código que escrevi para tentar analisar o texto interno das tags em , com a 'entrada' sendo o 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);
        } 

Estou esperando um NodeList de tamanho quatro.No entanto, quando imprimo o resultado, o resultado é do tamanho 1:"ArchitectProject ArchitectProject ManagerGerente de Projetos Arquitetônicos"

Eu construí meu XMLNodeList titleList errado?Como posso percorrer e processar ainda mais a árvore XML para obter os valores internos das tags 'title' em 'also_called'?

Foi útil?

Solução

Você obtém os elementos nomeados also_called.Existe apenas um desses elementos na sua lista.O que você provavelmente deseja é fazer com que os filhos do also_called nó.

Por exemplo:

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);
}

Além disso, considere usar XDocument e LINQ to XML em vez de XmlDocument - é muito mais simples de usar:

XDocument root = XDocument.Parse(input);

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

Outras dicas

Você só precisa de um pouquinho de XPath.Isto seleciona todos os title nós que são filhos do primeiro also_called.

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

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

É raro que você precise usar GetElementsByTagName ou ChildNodes e sua turma e/ou tente inspecionar um nó para descobrir se é o que você deseja.Navegando em XML com XmlDocument é tudo uma questão de usar XPath com o qual você pode especificar bastante quando se trata de obter nós que atendam a critérios específicos;tanto em termos de estrutura dentro da árvore quanto de conteúdo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top