tem como ler o xml verificar a tag ReferencedEntitlement e verificar [telefone removido] se o numero é final 0038, caso isso seja afirmativo apagar a tag inteira
Acho que você pode tentar fazer isso com Dom4j + XPath para achar o nó e fazer a remoção...
packagesnippet;importjava.io.IOException;importjava.util.List;importorg.dom4j.Document;importorg.dom4j.DocumentException;importorg.dom4j.DocumentHelper;importorg.dom4j.Element;publicclassSnippet{publicstaticvoidmain(String[]args)throwsIOException,DocumentException{Stringxml="<root>"+"<ReferencedEntitlement id=\"4504a142-d39c-4af4-8314-62b90feac165\">"+"<CreationDate>2011-05-20T14:12:31.323Z</CreationDate>"+"<ProductId>c856c318-51e1-468a-b950-8bc3ed3e5b89</ProductId>"+"<CustomerId>[telefone removido]</CustomerId>"+"</ReferencedEntitlement>"+"<ReferencedEntitlement id=\"4504a142-d39c-4af4-8314-62b90feac165\">"+"<CreationDate>2011-05-20T14:12:31.323Z</CreationDate>"+"<ProductId>c856c318-51e1-468a-b950-8bc3ed3e5b8x</ProductId>"+"<CustomerId>485723003x</CustomerId>"+"</ReferencedEntitlement>"+"</root>";Documentdoc=DocumentHelper.parseText(xml);for(Elementnoh:((List<Element>)doc.selectNodes("//ReferencedEntitlement/CustomerId"))){Stringtexto=noh.getTextTrim();System.out.println("Vendo: "+noh.asXML()+"("+texto+")");if(texto!=null&&texto.endsWith("0038")){//remove o referenced...System.out.println("Removendo "+noh.getParent().asXML());noh.getParent().detach();}}//o que sobrou:System.out.println(doc.asXML());}}
E
erickfm8
olha como estou fazendo
publicclassMain{Stringcaminho="C:"+File.separator+"Desenvolvimento"+File.separator+"XML"+File.separator+"VODUsage_007099_20110520151501.xml";StringcaminhoModificado="C:"+File.separator+"Desenvolvimento"+File.separator+"XML"+File.separator+"VODUsage_007099_20110520151501MOD.xml";/** * @param args */publicstaticvoidmain(String[]args){try{newMain().converter();}catch(Exceptione){// TODO Auto-generated catch blocke.printStackTrace();}}privateStringretornaValor(Elementelem,StringtagName)throwsException{NodeListchildren=elem.getElementsByTagName(tagName);if(children==null)returnnull;Elementchild=(Element)children.item(0);if(child==null)returnnull;returnchild.getFirstChild().getNodeValue();}privatebooleanvalidarNumero(Stringnumero){Patternp=Pattern.compile("[0-9]*0038");Matcherm=p.matcher(numero);returnm.matches();}publicvoidconverter()throwsException{DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();DocumentBuilderdb=dbf.newDocumentBuilder();Documentdoc=db.parse(caminho);Elementraiz=doc.getDocumentElement();NodeListlistaReference=raiz.getElementsByTagName("ReferencedEntitlement");inttamanho=listaReference.getLength();for(inti=0;i<tamanho;i++){Elementelemento=(Element)listaReference.item(i);NodeListn=elemento.getChildNodes();for(intx=0;x<n.getLength();x++){if(n.item(x).getNodeName().equals("CustomerId")){Stringnumero=retornaValor(elemento,"CustomerId");if(validarNumero(numero)){raiz.removeChild(elemento);}}}}DOMSourcesource=newDOMSource(doc);StreamResultresult=newStreamResult(newFileOutputStream(newFile(caminhoModificado)));TransformerFactorytransFactory=TransformerFactory.newInstance();Transformertransformer=transFactory.newTransformer();transformer.transform(source,result);}}
mais na hora de remover “raiz.removeChild(elemento);”
Eu não conheço o DOM/XML “padrão” do Java, desculpe. Acho que não poderei te ajudar.
Porém recomendo que você troque para o Dom4J (+ Jaxen, que é a dependência para o XPath funcionar) se possível
Deixa eu justificar: a biblioteca é bem documentada, vem com vários “selectNodes” que funcionam com XPath. Tem também conversão fácil para e dê Strings. E é uma lib que vem por “padrão” no JBoss, o que facilita o uso quando em servidor de aplicativo.
E
erickfm8
cara não consegui usar seu exemplo ele pede pra fazer um monte de cast
E
erickfm8
eu tenho que add bibliotecas? eu não conheço este, ja aproveitando vc fala //remove o referenced… como eu removo?
L
leo.andven
Isso no Java 6?
Se você quiser, eu posso tentar colocar o projeto Eclipse zipado aqui…
Parsing XML
One of the first things you'll probably want to do is to parse an XML document of some kind. This is easy to do in dom4j. The following code demonstrates how to this.
SAXReaderreader=newSAXReader();Filearquivo=newFile("xml.xml");Documentdoc=reader.read(arquivo);for(Elementnoh:((List<Element>)doc.selectNodes("//ReferencedEntitlement/CustomerId"))){Stringtexto=noh.getTextTrim();System.out.println("Vendo: "+noh.asXML()+"("+texto+")");if(texto!=null&&texto.endsWith("038")){// remove o referenced...System.out.println("Removendo "+noh.getParent().asXML());noh.getParent().detach();}}// o que sobrou:System.out.println("--------------");System.out.println("Sobrou:");System.out.println(doc.asXML());
Tem a ver com a estrutura do XML sim. Seu XML tem namespaces, que o Jaxen precisa "saber".
Seguindo o link (achado com [google]dom4j xpath xmlns[/google]), vemos que isso acontece com o jaxen. Tem como resolver também. Fica como abaixo:
SAXReaderreader=newSAXReader();Filearquivo=newFile("xml.xml");Documentdoc=reader.read(arquivo);Map<String,String>map=newHashMap<String,String>();map.put("vodusage","urn:eee:vodusage:2.0");org.jaxen.XPathxpath=newDom4jXPath("//vodusage:ReferencedEntitlement/vodusage:CustomerId");xpath.setNamespaceContext(newSimpleNamespaceContext(map));List<Element>nodes=xpath.selectNodes(doc);for(Elementnoh:nodes){Stringtexto=noh.getTextTrim();System.out.println("Vendo: "+noh.asXML()+"("+texto+")");if(texto!=null&&texto.endsWith("038")){// remove o referenced...System.out.println("Removendo "+noh.getParent().asXML());noh.getParent().detach();}}// o que sobrou:System.out.println("--------------");System.out.println("Sobrou:");System.out.println(doc.asXML());
Ele não atualiza o arquivo, isso você escreve depois que terminar.
Só tem um ReferencedEntitlement que tem CustomerId no XML que você enviou. Esse um está com final 038. Está certo, então. Veja no output que ele deixa o “espaço” aonde ficaria o elemento removido…
Cara de u fhush e funcionou pefeitamente,
Deve ter mexido mtu com isso rsrsrsrs
Se quebro um galhão agora tenho que fazer mais uma modificaçao mais vou fuçar aqui
essa modificação aiii,se vc ja tiver um solução rapida e não for incomado,se não deixa que eu tento aki…
depois que eu removi o 038
verifica o id na mesma tag
<ReferencedEntitlement id=“001” tenho que pegar este id e buscar na tag <TVodPurchase id="001 se for igual remover tbm a tag
Muito Obrigado
E
erickfm8
ou pode ser o
001 que é igual o id da
TVodPurchase id
L
leo.andven
Vou dar as dicas:
Para pegar o valor do atributo: .valueOf("@nomeAtributo");
Para pegar elementos com um atributo com valor específico: .selectNodes("//TVodPurchase[@id=‘001’]");