Parser XML

7 respostas
alex

Senhores,
existe alguma “normalização” de arquivos XML que mescle nós de atributos chave iguais ? Explicando melhor: Tenho algumas tabelas no banco de dados que forman um estrutura em árvore. Ao criar uma query para recuperar todos os registros de todos os itens e sub-itens, recebo um resultSet que tem em sua primeira coluna o item pai repetido várias vezes. Outra coluna pai, repetida algumas vezes dentro do item pai anteiror, e assim por diante …

folder attribute attribute attribute folder attribute attribute folder attribute
A x x x 1 x x Z x
A x x x 1 x x Z x
A x x x 1 x x Y x
A x x x 2 x x Y x
A x x x 2 x x E x
A x x x 2 x x E x
A x x x 3 x x Z x
A x x x 1 x x Z x
A x x x 1 x x Y x
B x x x 1 x x Y x
B x x x 1 x x E x
B x x x 5 x x E x
B x x x 5 x x Z x
B x x x 5 x x Z x
C x x x 2 x x Y x

Ao enviar isso para um programa Desktop feito em Java, optei por faze-lo via XML. Como cada nó correponde a uma linha, imaginei que pudesse existir algum processo que identificasse os nós “folder” de mesmo nome (atributo name por exemplo) e os mesclasse de modo que o XML adiquirisse ramificações a partir desses nós. Devo fazer isso na “unha” ? Será que existe algo que faça isso para mim ?

A
|_ 1
| |_ Z
| |_ Y
|
|_ 2
|_ 3

B
|_ 1
|_ 5

C
|_ 2

7 Respostas

Hebertbc

Vc quer algo parecido com isso?

<folder>
	<name>A</name>
	<atribb>X</atribb>
	<folder>
		<name>1</name>
		<atribb>X</atribb>
		<folder>
			<name>Y</name>
			<atribb>X</atribb>
		</folder>
	</folder>
</folder>
alex

É nesse sentido sim, porém virão em seguida outras sequencias tal como a você mostrou que terão “path’s” comuns:

<folder> (A1Y)
    <name>A</name>   
    <atribb>X</atribb>   
    <folder>   
        <name>1</name>   
        <atribb>X</atribb>   
        <folder>   
            <name>Y</name>   
            <atribb>X</atribb>   
        </folder>   
    </folder>   
</folder>  
<folder>   (A1Z)
    <name>A</name>   
    <atribb>X</atribb>   
    <folder>   
        <name>1</name>   
        <atribb>X</atribb>   
        <folder>   
            <name>Z</name>   
            <atribb>X</atribb>   
        </folder>   
    </folder>   
</folder>

Como faria para que ficasse assim:

folder> 
<name>A</name>   
    <atribb>X</atribb>   
    <folder>   
        <name>1</name>   
        <atribb>X</atribb>   
        <folder>   
            <name>Y</name>   
            <atribb>X</atribb>   
        </folder>
        <folder>   
            <name>Z</name>   
            <atribb>X</atribb>   
        </folder>   
    </folder>   
</folder>
Hebertbc

É so vc criar uma logica pra gerar um objeto nesse formato, depois os xstream faz o resto.

(Edit) Um metodo recursivo resolve seu problema.

public class Folder {
    String nome;
    List<String> atribb;
    List<Folder> subFolders;

public List<String> getAtribb() {
        return atribb;
    }

    public void setAtribb(List<String> atribb) {
        this.atribb = atribb;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public List<Folder> getSubFolders() {
        return subFolders;
    }

    public void setSubFolders(List<Folder> subFolders) {
        this.subFolders = subFolders;
    }
}
alex

Pelo que vi o XTream funciona tal como o XMLDecoder (JavaBeans). Não sei se entendi de forma correta mas o processo de deserialização cria a instância do objeto. Em seguida eu precisari acrescentar sub-itens em uma instância já criada (por exemplo: folder A1 já criado >> criar folder A2 dentro de A) a partir de outro objeto em deserialização ??? Vou estudar a partir daqui. Obrigado.

alex

É … não enetendi !

Folder folder = (Folder) xtream.fromXML(xml);

Como eu “jogo” o próximo nó do XML dentro do Folder já criado ?

alex

Por então pessoal … deixemos o XML de lado um pouco e usemos a resultSet no lugar. Lendo linha por linha da view, inserimos sobre um “bean” (parecido com o que o nosso amigo Hebertbc nos deu) os dados provenientes dessa linha. Colocamos esse bean em uma List. Em seguida, quando carregamos o segundo bean, verificamos elemento a elemento (aqueles que representam um “folder”) se ele já existe em nossa List e em caso afirmativo, obtemos uma referência desse ao invés de uma nova instância. De forma simplificada é isso. Obrigado Hebertbc !

Hebertbc

Opa… desculpa a demora mais tava meio tenso la no trampo… qualquer coisa so mandar pm… vlw ae

Criado 17 de março de 2010
Ultima resposta 20 de mar. de 2010
Respostas 7
Participantes 2