Leitura de XML com Xpath

3 respostas
D

Bom dia pessol, estou aqui tentando realizar a leitura de um XML com o xpath mas estou enfrentando um problema… segue a descrição :

O XML :

<Schema name="ProcessoObjetoParcelaCube" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="cube.xsd">
	<Cube name="OBJ_PARCELA_CUBE">
		<Table name="D_PROCESSO_OBJETO_PARCELA" > 
		        <SQL dialect="mssql">
			        ID_PROCESSO_OBJETO_PARCELA IN (
      			        SELECT D_PROCESSO_OBJETO_PARCELA.ID_PROCESSO_OBJETO_PARCELA FROM D_PROCESSO_OBJETO_PARCELA
			        INNER JOIN D_PROCESSO_OBJETO ON (D_PROCESSO_OBJETO_PARCELA.ID_PROCESSO_OBJETO = D_PROCESSO_OBJETO.ID_PROCESSO_OBJETO)
			        INNER JOIN M_PROCESSO ON (D_PROCESSO_OBJETO.ID_PROCESSO = M_PROCESSO.ID_PROCESSO) WHERE (1=1))
			</SQL>
		</Table> ( ... )

Estou realizando a consulta desta forma:

xpath.evaluate("/Schema/Cube/Table", cubeDoc, XPathConstants.NODESET);

Com esta consulta ele me retorna:

ID_PROCESSO_OBJETO_PARCELA IN (
			SELECT D_PROCESSO_OBJETO_PARCELA.ID_PROCESSO_OBJETO_PARCELA FROM D_PROCESSO_OBJETO_PARCELA
			INNER JOIN D_PROCESSO_OBJETO ON (D_PROCESSO_OBJETO_PARCELA.ID_PROCESSO_OBJETO = D_PROCESSO_OBJETO.ID_PROCESSO_OBJETO)
			INNER JOIN M_PROCESSO ON (D_PROCESSO_OBJETO.ID_PROCESSO = M_PROCESSO.ID_PROCESSO) WHERE (1=1))

Sendo que eu acho que deveria retornar inclusive: … , certo ? já que a consulta é: “/Schema/Cube/Table” e não “/Schema/Cube/Table/SQL”

E eu sei que ele retorna isto, através do debugg, pois se eu uso o getNodeValue, ele não me retorna nada, sendo que está ali quando eu coloco a seta em cima do objeto no debugg …

NodeList ndL = (NodeList) xpath.evaluate("/Schema/Cube/Table", cubeDoc, XPathConstants.NODESET);
        String v = ndL.item(0).getNodeValue();

3 Respostas

ribclauport

Quall jar você está usando?

D

JAR ?? Se vc está perguntando se estou usando alguma API, não estou estou usando o nativo do Java “javax.xml.xpath” … e se vc qr saber a versão do java é 6 … se não era isso, não sei oq vc qr saber … uhauhauha

ribclauport

usando o evaluate, as tags xml não serão availadas e somente o conteúdo pelo que testei aqui, alterei o código pego do site:

http://onjava.com/onjava/2005/01/12/xpath.html#overview

e para trazer os nós seria algo como:

catalog.xml -->esta dentro de src
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; 
&lt;catalog xmlns:journal="http://www.w3.org/2001/XMLSchema-Instance" &gt; 
  &lt;journal:journal title="XML"  publisher="IBM developerWorks"&gt; 
      &lt;article journal:level="Intermediate"              
            date="February-2003"&gt;   
         &lt;title&gt;Design XML Schemas Using UML&lt;/title&gt; 
         &lt;author&gt;Ayesha Malik&lt;/author&gt;  
      &lt;/article&gt;
  &lt;/journal:journal&gt; 
  &lt;journal title="Java Technology"  publisher="IBM       
        developerWorks"&gt; 
      &lt;article level="Advanced" date="January-2004"&gt;   
          &lt;title&gt;Design service-oriented architecture    
                 frameworks with J2EE technology&lt;/title&gt; 
          &lt;author&gt;Naveen Balani &lt;/author&gt;  
      &lt;/article&gt;
      &lt;article level="Advanced" date="October-2003"&gt;   
          &lt;title&gt;Advance DAO Programming&lt;/title&gt; 
          &lt;author&gt;Sean Sullivan &lt;/author&gt;  
      &lt;/article&gt;
      
  &lt;/journal&gt; 
&lt;/catalog&gt;
classe de Teste
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

public class Xpath {
	public static void main(String[] args) throws XPathExpressionException, FileNotFoundException, ParserConfigurationException {
		File xmlDocument =  new File(&quot;./src/catalog.xml&quot;);
		InputSource inputSource =  new InputSource(new FileInputStream(xmlDocument));
		XPathFactory  factory = XPathFactory.newInstance();
		XPath xPath=factory.newXPath();
		NodeList level =  (NodeList) xPath.evaluate(&quot;/catalog/journal/article&quot;,inputSource,XPathConstants.NODESET);
		
		for(int i =0; i &lt; level.getLength(); i++){
			System.out.println(level.item(i).getNodeName());
			
		}
	}
}

Saída:

article
article

Realizei da forma que você fez, e não importa quantas tags existirem, nos meus testes so trouxe o conteudos das tags...

Na verdade sua pesquisa esta trazendo todas as tags "Table", como no exemplo:

bookstore/book Selects all book elements that are children of bookstore

retirado de http://www.w3schools.com/xpath/xpath_syntax.asp

Sendo assim o evaluate esta trazendo o conteudo que não é "tag" que esta dentro de Table!

Criado 22 de março de 2012
Ultima resposta 22 de mar. de 2012
Respostas 3
Participantes 2