2011-04-15 21 views
5

Bu xml dosyasına sahibim ve Xpath ile bazı değerler almak istiyorum.Java'da XPath ile XML Ayrıştırma - Java'da Xpath ve NodeList ile XML dosyasından veri alın

işin yarım kaldığı ama burada bazı dosyanın son bölümünde sorun (Devletler Düğümü)

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

Ve java kodu almak: paket 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); 
     } 


    } 
    } 
} 

ve çıkış olacaktır: ID 2 ile durumuna bakıldığında

İlk örnek

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

İkinci örnek

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

metin description2 değildir description1 olup. Ben ayrıştırıcı ikinci çocuğa hareket etmiyor ve her zaman hala köstebek çocukta olduğunu düşünüyorum. Peki, devletin niteliğini almak için nasıl yapabilirim ve nasıl yapabilirim ????????

+0

Eğer Devletleri nodelist üzerinde yineleme olmamalı ?! –

+0

http://stackoverflow.com/a/21890347/3245218 –

cevap

2

Sen böyle bir şey yapmak zorunda kalacaktır:

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

adresinden bu sorunun cevabına bir cevabım var. Hızlı yanıt için teşekkürler ve öznitelikler için nasıl yapılır? – alibenmessaoud

+0

Cevabı düzenledim. – nabeelmukhtar

+0

@nabeelmukhtar: xml imzaları için java'da xpath kullanıyorum, ancak xpath dönüşümü çalışmıyor. Lütfen bu bağlantıya bakın - http://stackoverflow.com/questions/10698287/xpath-transformation-not-working-in-java – Ashwin