Pessoal estou montando um xml com JDOM e gostaria que quando uma tag não possuir um valor ela seja suprimida.
Pensei em montar uma rotina para percorrer todo XML usando um laço, verificando se a tag possui valor caso esteja vazia então suprima a tag.
Alguém teria uma idéia melhor?
Para aqueles que talvez encontrem o mesmo problema criei uma rotina para retirar as tags que não possuem conteudo:
private Element isEmptyTags(Element element) {
Element removeElement = element;
ContentFilter filter = new ContentFilter();
filter.setTextVisible(false);
Iterator<Element> iterator = element.getDescendants(filter);
while ( iterator.hasNext()) {
Element el = (Element)iterator.next();
if ( el.getChildren().size() > 0 ) {
removeElement = el;
} else {
if ( el.getTextTrim().equals("")) {
iterator.remove();
removeElement.removeContent(el);
}
}
}
return element;
}
Estou utilizando JDOM e essa foi a forma mais simples que encontrei para resolver o meu problema.
Utilizei um objeto ContentFilter para listar somente os elementos do meu arquivo XML, depois verifico se a tag corrente possuiu filhos caso sim guardo a referencia do objeto Element para remover os elementos sem texto.
A linha que possui o comando iterator.remove() foi adicionada para não ser gerada uma exception ConcurrentModificationException pois estamos modificando um Iterator enquanto percorremos o mesmo.
public static void main(String[] arqgv){
try {
//Aqui você informa o nome do arquivo XML.
File f = new File("c:/mural.xml");
//Criamos uma classe SAXBuilder que vai processar o XML4
SAXBuilder sb = new SAXBuilder();
//Este documento agora possui toda a estrutura do arquivo.
Document d = sb.build(f);
//Recuperamos o elemento root
Element mural = d.getRootElement();
List elements = mural.getChildren();
Iterator iterator = elements.iterator();
//Iteramos com os elementos filhos, e filhos do dos filhos
while (iterator.hasNext()) {
Element element = (Element) iterator.next();
System.out.println("Códido: "+ element.getAttributeValue("id"));
System.out.println("Prioridade: "+ element.getAttributeValue("prioridade"));
System.out.println("Para: "+ element.getChildText("para"));
System.out.println("De: "+ element.getChildText("de"));
System.out.println("Corpo: "+ element.getChildText("corpo"));
System.out.println("logradouro: "+ element.getChildText("logradouro"));
}
} catch (JDOMException ex) {
Logger.getLogger(LerXml.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(LerXml.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
e o arquivo XML:
<mural>
<mensagem id=“00001” prioridade=“10”>
<para>nome de envio</para>
<de>remetente</de>
<corpo>Este e apenas um teste</corpo>
<endereco>
<logradouro>R DA ASSEMBLEIA</logradouro>
<cep>06300-000</cep>
</endereco>
</mensagem>
</mural>
Bom dia pessoal, estou com um problema parecido com o de voces, porem no meu caso devo expandir as tags vazias, deixar como no exemplo abaixo.
Estou usando o netbeans, e JDOM, mas ele deixa as tagas vazias assim: