Pregunta

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

Tomé este XML devuelto por ONet y me gustaría analizar la información para usarla.Aquí está el código que escribí para intentar analizar el texto interno de las etiquetas en , siendo la 'entrada' el XML de Onet.

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

Espero una NodeList de tamaño cuatro.Sin embargo, cuando imprimo el resultado, el resultado tiene un tamaño de 1:"ArquitectoProyecto ArquitectoGerente de ProyectoGerente de Proyectos Arquitectónicos"

¿He construido mal mi lista de títulos XMLNodeList?¿Cómo puedo recorrer y procesar aún más el árbol XML para obtener los valores internos de las etiquetas de 'título' en 'también_llamado'?

¿Fue útil?

Solución

Obtienes los elementos nombrados. also_called.Sólo hay un elemento de este tipo en su lista.Lo que probablemente quieras es conseguir que los hijos del also_called nodo.

Por ejemplo:

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

Además, considere usar XDocument y LINQ a XML en lugar de XmlDocument - es mucho más sencillo de usar:

XDocument root = XDocument.Parse(input);

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

Otros consejos

Sólo necesitas un poquito de XPath.Esto selecciona todos los title nodos que son hijos del primero also_called.

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

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

Es raro que necesites usar GetElementsByTagName o ChildNodes y los de su calaña y/o intente inspeccionar un nodo para determinar si es el que desea.Navegando XML con XmlDocument se trata de usar XPath con lo cual puedes especificar bastante a la hora de conseguir nodos que cumplan criterios específicos;tanto en términos de estructura dentro del árbol como de contenido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top