2011-04-15 16 views
5

Tengo este archivo xml y quiero obtener algunos valores con Xpath.Analizando XML con XPath en Java - Obtenga datos del archivo XML con Xpath y NodeList en Java

La mitad del trabajo está hecho pero tengo algunos problemas en la última parte del archivo (Nodo Unidos)

<?xml version="1.0" encoding="UTF-8"?> 
<favoris> 
    <workflow codewf="wf1000"> 
     <information> 
      <title>wf1</title> 
      <desc>description 1</desc> 
      <nberState>2</nberState> 
      <text>text text text text text text text</text> 
     </information> 
     <states> 
      <state id="1" IDemployee="2">description1</state> 
      <state id="2" IDemployee="3">description2</state> 
     </states> 
    </workflow> 

    <workflow codewf="wf2000"> 
     <information> 
      <title>wf2</title> 
      <desc>description 2</desc> 
      <nberState>3</nberState> 
      <text>text text text text text text text</text> 
     </information> 
     <states> 
      <state id="1" IDemployee="3">description1</state> 
      <state id="2" IDemployee="2">description2</state> 
      <state id="3" IDemployee="4">description2</state> 
     </states> 
    </workflow> 

</favoris> 

Y aquí el código de Java: paquete myXML;

import java.io.FileReader; 
import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathConstants; 
import javax.xml.xpath.XPathFactory; 
import org.w3c.dom.Element; 
import org.w3c.dom.NodeList; 
import org.xml.sax.InputSource; 
public class xmlParty { 
    public static void main(String[] args) throws Exception { 
    XPathFactory factory = XPathFactory.newInstance(); 
    XPath xPath = factory.newXPath(); 
    NodeList favoris = (NodeList) xPath.evaluate("/favoris/workflow[@codewf='wf1000']", 
      new InputSource(new FileReader("a.xml")), 
      XPathConstants.NODESET); 
    for (int i = 0; i < favoris.getLength(); i++) { 
     Element workflow = (Element) favoris.item(i); 
     String title = xPath.evaluate("information/title", workflow); 
     String desc_w = xPath.evaluate("information/desc", workflow); 
     String nberState = xPath.evaluate("information/nberState", workflow); 
     String text = xPath.evaluate("information/text", workflow); 
     System.out.println(workflow.getAttribute("codewf") +" "+title + " " + desc_w + " " + nberState + " " + text); 

     NodeList States = (NodeList)xPath.evaluate("states/state", workflow, XPathConstants.NODESET); 
     System.out.println(States.getLength()); 
     for (int k = 0; k < States.getLength(); k++) { 
      String desc_state = xPath.evaluate("states/state", workflow); 
      System.out.println(desc_state); 
     } 


    } 
    } 
} 

y la salida será:

Primer ejemplo

wf1000 wf1 description 1 2 text text text text text text text 
2 
description1 
description1 

Segundo ejemplo

wf2000 wf2 description 2 3 text text text text text text text 
3 
description1 
description1 
description1 

Mirando el estado con ID 2, el texto es description2 no description1. Creo que el analizador no se mueve al segundo hijo y siempre lo hace al primer hijo. Entonces, ¿cómo puedo hacer y también cómo hacerlo para obtener el atributo de estado ????????

+0

no en caso de que iterar sobre Estados NodeList ?! –

+0

Recibí una respuesta briallint de esta pregunta en http://stackoverflow.com/a/21890347/3245218 –

Respuesta

2

Usted tendrá que hacer algo como:

for (int k = 0; k < States.getLength(); k++) { 
      String desc_state = xPath.evaluate("states/state[position()=" + (k + 1) + "]", workflow); 
      String id_employee = xPath.evaluate("states/state[position()=" + (k + 1) + "]/@IDemployee", workflow); 
      System.out.println(desc_state + ":" + id_employee); 
} 
+0

Gracias por la respuesta rápida y cómo hacer para los atributos? – alibenmessaoud

+0

He editado la respuesta. – nabeelmukhtar

+0

@nabeelmukhtar: Estoy usando xpath en java para las firmas xml pero la transformación xpath no funciona. Por favor, consulte este enlace - http://stackoverflow.com/questions/10698287/xpath-transformation-not-working-in-java – Ashwin

Cuestiones relacionadas