Método recursivo para coletar todos os elementos de um xml

7 respostas
L

Olá pessoal,
Tenho uma dúvida neste método, que deve apresentar os campos presentes na hierarquia de um xml existente. A análise deve ser realizada de maneira recursiva.

Exemplo de um xml com a mesma estrutura dos que estou uitilizando.

<cat:CatalogoSistema xmlns:cat="http://nowhere.to.go">   
   <cat:Sistema>Comercio</cat:Sistema>   
   <cat:Elementos>   
     <cat:Elemento>   
       <cat:Nome>ComercioRaiz</cat:Nome>   
       <cat:Tipo>ComercioRaiz</cat:Tipo>   
       <cat:Elementos>   
         <cat:Elemento>   
           <cat:Nome>ComercioPadaria</cat:Nome>   
           <cat:Tipo>ComercioPadaria</cat:Tipo>   
           <cat:Elementos>   
             <cat:Elemento>   
               <cat:Nome>ComercioRaizPadariafarinha</cat:Nome>   
               <cat:Tipo>java.math.BigDecimal</cat:Tipo>   
             </cat:Elemento>   
             <cat:Elemento>   
               <cat:Nome>ComercioRaizPadariaoleo</cat:Nome>   
               <cat:Tipo>java.math.BigDecimal</cat:Tipo>   
             </cat:Elemento>   
             <cat:Elemento>   
               <cat:Nome>ComercioRaizPadariafermento</cat:Nome>   
               <cat:Tipo>java.math.BigDecimal</cat:Tipo>   
             </cat:Elemento>   
             <cat:Elemento>   
               <cat:Nome>ComercioRaizPadarialeiteDesnatado</cat:Nome>   
               <cat:Tipo>java.math.BigDecimal</cat:Tipo>   
             </cat:Elemento>   
             <cat:Elemento>   
               <cat:Nome>ComercioRaizPadariamacarrao</cat:Nome>   
               <cat:Tipo>java.math.BigDecimal</cat:Tipo>   
             </cat:Elemento>   
             <cat:Elemento>   
               <cat:Nome>ComercioRaizPadariaaguaMineral</cat:Nome>   
               <cat:Tipo>java.math.BigDecimal</cat:Tipo>   
             </cat:Elemento>   
        </cat:Elementos>   
     </cat:Elemento>   
    </cat:Elementos>   
     </cat:Elemento>   
   </cat:Elementos>   
 </cat:CatalogoSistema>

Meu método:

public void apresentaCatalogo(File f, CatalogoSistemaDocument pod){

  int i=0;

  treeData = new TreeNodeBase("foo-folder", "Catalogo", false);

  //cria uma instância de Elemento na qual é atribuída a raíz do documento
  Elemento elemento[] = pod.getCatalogoSistema().getElementos().getElementoArray();

  //percorrendo todos os <elemento> filhos que existem no elemento raiz
  Elemento[] elemento1 = elemento[i].getElementos().getElementoArray();
  for(i=0; i<elemento.length; i++){
    TreeNodeBase authorNode = new TreeNodeBase ("declaracao", elemento1[i].getNome(), false);
    treeData.getChildren().add(authorNode);
  }

  //coletando uma possível classe sendo representada pelo elemento sendo analisado.

  Elementos elementos = elemento[i].getElementos();

  //desce na hierarquia para a apresentação dos atributos folha.
  if (elementos != null){
    apresentaCatalogo(f, pod);
    }

  else{
    Elemento[] elemento2 = elemento1[i].getElementos().getElementoArray();
    TreeNodeBase bookNode3 = new TreeNodeBase ("declaracao", elemento1[i].getNome(), false);
    treeData.getChildren().add(bookNode3);
  }

Está ocorrendo um loop infinito no elemento raíz e não consigo coletar os outros elementos.

Alguém pode me ajudar?? É urgentíssimo!!

Obrigada

7 Respostas

L

Não estou conseguindo fazer um teste para a saída da recursão.

maquiavelbona

Uma curiosidade, por acaso está querendo fazer um digester XML?

Luiz_Aguiar

Lívia não entendi se é exatamente isso que esta tentando fazer… mas veja esse exemplo aqui http://www.guj.com.br/java.tutorial.artigo.22.1.guj pra ver se ajuda.

Arcadex

Olá Livia,

já conseguiu resolver seu problema??

Caso não tenha resolvido ainda. Faz um upload aí do arquivo XML e das suas classes javas usadas para teste, ou, copia e cola a classe de teste toda.

[]'s

L

Ainda não consegui fazer.

Vou colar aqui o xsd que estou utilizando.

<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="http://nowhere.to.go"
xmlns = "http://www.w3.org/2001/XMLSchema"
xmlns:mc = "http://nowhere.to.go"
elementFormDefault="qualified" >
 
 <element name="CatalogoSistema">
  <complexType>
    <sequence>
      <element name="Sistema" type="string" minOccurs="1" maxOccurs="1"/>
      <element name="Elementos" type="mc:Elementos" minOccurs="1" maxOccurs="1"/>
    </sequence>
  </complexType>  
 </element>

 <complexType name="Elementos">
  <sequence>
    <element name="Elemento" type="mc:Elemento" minOccurs="0" maxOccurs="unbounded"/>
  </sequence>
 </complexType>
  
 <complexType name="Elemento"> 
   <sequence> 
    <element name="Nome" type="string" minOccurs="1" maxOccurs="1"/>
    <element name="Tipo" type="string" minOccurs="1" maxOccurs="1"/> 
    <element name="Chave" type="mc:Chave" minOccurs="0" maxOccurs="1"/>    
    <element name="Elementos" type="mc:Elementos" minOccurs="0" maxOccurs="1"/>
   </sequence> 
 </complexType> 

<simpleType name="Chave">
   <restriction base="string">
    <enumeration value="SIM"/>
    <enumeration value="NAO"/>
   </restriction> 
</simpleType>

Preciso ler todos os elementos de um xml qualquer, que obedeça a estrutura do xsd, é claro.
Aqui vai um dos meus xml de exemplo, eu inventei os nomes dos elementos, pois não posso postar aqui os nomes verdadeiros.

<cat:CatalogoSistema xmlns:cat="http://nowhere.to.go">
  <cat:Sistema>COMERCIO</cat:Sistema>
  <cat:Elementos>
    <cat:Elemento>
      <cat:Nome>ComercioRaiz</cat:Nome>
      <cat:Tipo>ComercioRaiz</cat:Tipo>
      <cat:Elementos>
        <cat:Elemento>
          <cat:Nome>ComercioRaizrestaurante</cat:Nome>
          <cat:Tipo>java.lang.String</cat:Tipo>
          <cat:Chave>SIM</cat:Chave>
        </cat:Elemento>
        <cat:Elemento>
          <cat:Nome>ComercioRaizbar</cat:Nome>
          <cat:Tipo>java.lang.String</cat:Tipo>
          <cat:Chave>SIM</cat:Chave>
        </cat:Elemento>
        <cat:Elemento>
          <cat:Nome>Funcionarios</cat:Nome>
          <cat:Tipo>Funcionarios</cat:Tipo>
          <cat:Elementos>
            <cat:Elemento>
              <cat:Nome>ComercioRaizFuncionariossalarioFuncionarios</cat:Nome>
              <cat:Tipo>java.lang.String</cat:Tipo>
            </cat:Elemento>
          </cat:Elementos>
        </cat:Elemento>
        <cat:Elemento>
          <cat:Nome>Proprietarios</cat:Nome>
          <cat:Tipo>Proprietarios</cat:Tipo>
          <cat:Elementos>
            <cat:Elemento>
              <cat:Nome>ComercioRaizProprietariosenderecoResidencial</cat:Nome>
              <cat:Tipo>java.lang.String</cat:Tipo>
            </cat:Elemento>
            <cat:Elemento>
              <cat:Nome>ComercioRaizProprietariosenderecoComercial</cat:Nome>
              <cat:Tipo>java.lang.String</cat:Tipo>
            </cat:Elemento>
          </cat:Elementos>
        </cat:Elemento>
        <cat:Elemento>
          <cat:Nome>Fornecedores</cat:Nome>
          <cat:Tipo>Fornecedores</cat:Tipo>
          <cat:Elementos>
            <cat:Elemento>
              <cat:Nome>ComercioRaizFornecedorescadastroVendas</cat:Nome>
              <cat:Tipo>java.lang.String</cat:Tipo>
            </cat:Elemento>
          </cat:Elementos>
        </cat:Elemento>
      </cat:Elementos>
    </cat:Elemento>
  </cat:Elementos>
</cat:CatalogoSistema>

Minha classe CatalogoBean

public class CatalogoBean {
	
	private String nome;
	private String tipo;
	private String caminhoXml;
	private TreeNode treeData;

	public String getNome(){
		return nome;
	}
	public String getTipo(){
		return tipo;
	}
	public TreeNode getTreeData(){
		return treeData;
	}
	public void setTreeData(TreeNode paramTreeData){
		treeData = paramTreeData;
	}
	
	public void setNome(String paramNome){
		nome = paramNome;
	}
	public void setTipo(String paramTipo){
		tipo = paramTipo;
	}
	public String getCaminhoXml(){
		return caminhoXml;
	}
	
	public void setCaminhoXml(String anycaminhoXml){
		caminhoXml = anycaminhoXml;
	}


  /**
      * Método que obtém o caminho do xml
      * @author Livia Cassiano
      */
	public String visualizar(){
			
		    String resultado="falha";
		    File hbXmlFile = new File(caminhoXml);
		    createH(hbXmlFile);
			
			resultado="sucesso";
						
			return resultado;	
	}		
		

     /**
       * Método que faz o parse do xml dado como parametro e chama o método apresentaCatalogo
       * 
       * @author Livia Cassiano
       */
	public CatalogoSistemaDocument createH(File f){
	
			//cria uma variável CatalogoSistemaDocument para receber o arquivo xml
			CatalogoSistemaDocument pod = null;
				
			try{
				pod	= CatalogoSistemaDocument.Factory.parse(f);
			}catch(XmlException e){
			e.printStackTrace();
			}catch(IOException e){
			e.printStackTrace();			
			}
			apresentaCatalogo(f, pod);
		return pod;
	}

No próximo método, eu preciso carregar todos os elementos do meu xml, respeitando a hierarquia.
Preciso fazer um metodo recursivo que faça isso.
Mais ou menos assim:

public void apresentaCatalogo(File f, CatalogoSistemaDocument pod){
 
   int i=0;
 
   treeData = new TreeNodeBase("foo-folder", "Catalogo", false);
 
   //cria uma instância de Elemento na qual é atribuída a raíz do documento
   Elemento elemento[] = pod.getCatalogoSistema().getElementos().getElementoArray();
  System.out.println("\n a"+i+elemento[i].getNome());

   //percorrendo todos os <elemento> (internos) filhos que existem no elemento raiz
   Elemento[] elemInt = elemento[i].getElementos().getElementoArray();
   for(i=0; i<elemInt.length; i++){
   System.out.println("\n"+elemInt[i].getNome());
   
   }
}

Desta forma, consigo ler os elementos:
ComercioRaiz
ComercioRaizrestaurante
ComercioRaizbar
Funcionarios
Proprietarios
Fornecedores

Agora preciso fazer uma recursão para ler os outros elementos…no caso:
ComercioRaizFuncionariossalarioFuncionarios
ComercioRaizProprietariosenderecoResidencial
ComercioRaizProprietariosenderecoComercial
ComercioRaizFornecedorescadastroVendas

Bom, espero ter sido clara.

Se alguém conseguir me ajudar, eu agradeço

Guilherme_Silveira

Precisa ser com dom?

L

Eu não estou utilizando Dom.

Criado 8 de fevereiro de 2007
Ultima resposta 12 de fev. de 2007
Respostas 7
Participantes 5