Pessoal estou tendo dificuldades sobre como alterar elementos específicos em um arquivo xml.
O problema é o seguinte: tenho um arquivo com muitos elementos, onde somente me interessa alterar alguns. Antes de mais nada dei uma olhada em http://www.guj.com.br/articles#category_18 aí pensei que o meu caso seria usar o DOM pois ele é melhor para a escrita de documentos para os quais não se tem total domínio da estrutura (esquema).
Vi o exemplo em http://www.guj.com.br/articles/22 mas acho que ele não é bem o meu caso, pois o meu documento xml tem muitos elementos que não me interessam, logo não achei interessante criar uma classe para mapear tudo. Gostaria de colocar o documento em memória, acessar e alterar somente os elementos que preciso. Ou seja, um tipo de filtro.
Estou usando as seguintes classes:
org.w3c.dom.Document;
org.w3c.dom.Element;
org.w3c.dom.Node;
org.w3c.dom.NodeList;
Vocês podem me indicar uma abordagem para esse problema ?
Considero o xPath uma abordagem realmente interessante e inteligente. A única coisa é você terá que manter o objeto em memória.
Se você o transformar em um arquivo físico, por exemplo, terá de efetuar a leitura, parser, alteração, parser, escrita e etc…
Element element = (Element) xPath.evaluate("Name", doc, XPathConstants.NODE);
por essa:
XPathExpression expr = xPath.compile("/EMX:Model/*");
NodeList nos = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
ou seja, você vai precisar de uma lista (set) de nós.
Até tentei fazer um exemplo aqui, mas não conseguir acertar o path para seu caso
Posso tentar mais depois, mas tenta da uma analisada nisso que falei.
Ah,
E tem a observação do nel, isso tudo está em memória hem. Tem que ainda atualizar o xml depois.
Obrigado, charlesbraw! Consegui fazer aqui usando .NODESET conforme você falou. Em seguida fiz as alterações no NodeList e com Transformer gerei um outro xml “parseado”. Importante lembrar do separador no XPath, que deve ser “//” (para uma barra só).