pessoal alguem pode me dar uma ajuda com esse ultimo detalhe?
obrigado
pessoal alguem pode me dar uma ajuda com esse ultimo detalhe?
obrigado
Corrigindo o XML para ficar bem-formado, vi que o código funcionou sim… Ele remove o que tem final 038 (o primeiro). Não entendi seu problema?!
XML:
[code]
dfsfsdf
sdfsdfsd
545645645213038
<ReferencedEntitlement id="5eb81fd1-985a-4a18-85c1-fc8c0c4dd989">
<CreationDate>645645654</CreationDate>
<ProductId>5456566</ProductId>
</ReferencedEntitlement>
</ReferencedEntitlements>
<ReferencedAssets>
<ReferencedAsset id="4645645645">
<ExternalId>45648245</ExternalId>
<Titles>
<Title>456od</Title>
</Titles>
<IngestSource></IngestSource>
<ContentProviderId>dlatv.net</ContentProviderId>
<BillingId>04561</BillingId>
<ContractName>Robin 464565497</ContractName>
</ReferencedAsset>
</ReferencedAssets>
</References>
[/code]
Código (igual a antes, só lendo de arquivo)
[code]SAXReader reader = new SAXReader();
File arquivo = new File(“xml.xml”);
Document doc = reader.read(arquivo);
for (Element noh : ((List<Element>) doc
.selectNodes("//ReferencedEntitlement/CustomerId"))) {
String texto = 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());[/code]
Output do programa:
Sobrou:
<?xml version="1.0" encoding="UTF-8"?> <ReferencedEntitlement id="5eb81fd1-985a-4a18-85c1-fc8c0c4dd989">
<CreationDate>645645654</CreationDate>
<ProductId>5456566</ProductId>
</ReferencedEntitlement>
</ReferencedEntitlements>
<ReferencedAssets>
<ReferencedAsset id="4645645645">
<ExternalId>45648245</ExternalId>
<Titles>
<Title>456od</Title>
</Titles>
<IngestSource/>
<ContentProviderId>dlatv.net</ContentProviderId>
<BillingId>04561</BillingId>
<ContractName>Robin 464565497</ContractName>
</ReferencedAsset>
</ReferencedAssets>
</References>
[/code]
ueh, estou debugando, e o meu não entra no forr…
vc testou ai deu certinho?
sera que tem haver com a estrutura do xml?
<?xml version="1.0"?>
<VodUsage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:eee:vodusage:2.0">
<Period startDate="2011-05-20T14:00:00Z" endDate="2011-05-20T15:00:00Z" />
<TVodPurchases>
o inico é assim
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:
[code]SAXReader reader = new SAXReader();
File arquivo = new File(“xml.xml”);
Document doc = reader.read(arquivo);
Map<String, String> map = new HashMap<String, String>();
map.put("vodusage", "urn:eee:vodusage:2.0");
org.jaxen.XPath xpath = new Dom4jXPath(
"//vodusage:ReferencedEntitlement/vodusage:CustomerId");
xpath.setNamespaceContext(new SimpleNamespaceContext(map));
List<Element> nodes = xpath.selectNodes(doc);
for (Element noh : nodes) {
String texto = 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());[/code]
Output:
Sobrou:
<?xml version="1.0" encoding="UTF-8"?> <ReferencedEntitlement id="5eb81fd1-985a-4a18-85c1-fc8c0c4dd989">
<CreationDate>645645654</CreationDate>
<ProductId>5456566</ProductId>
</ReferencedEntitlement>
</ReferencedEntitlements>
<ReferencedAssets>
<ReferencedAsset id="4645645645">
<ExternalId>45648245</ExternalId>
<Titles>
<Title>456od</Title>
</Titles>
<IngestSource/>
<ContentProviderId>dlatv.net</ContentProviderId>
<BillingId>04561</BillingId>
<ContractName>Robin 464565497</ContractName>
</ReferencedAsset>
</ReferencedAssets>
</References>
</TVodPurchases>
[/code]
Esse é o cara rsrsrs eu dei uma lida tbm nos links parece estar certo…
mais aparce que esta apagando somente duas
. mais se vc observar a ultima saida do System.out.println("--------------");
System.out.println(“Sobrou:”);
System.out.println(doc.asXML());
nao aparece nenhum tag ReferencedEntitlement apaga todos
outra coisa ele não atualiza o arquivo xml né?
ah para gravar eu faço assim
File file = new File(caminhoModificado);
FileWriter out = new FileWriter( caminhoModificado );
doc.write( out );
unico problema é que ele esta terminado com a tag
</References>
e não com
</References>
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…
[quote=erickfm8]ah para gravar eu faço assim
File file = new File(caminhoModificado);
FileWriter out = new FileWriter( caminhoModificado );
doc.write( out );
unico problema é que ele esta terminado com a tag
</References>
e não com
</References>
[/quote]
Está rolando um out.flush() e out.close()?
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…
saca essa parte
<TVodPurchases>
<TVodPurchase id="001">
<PurchaseDate>45546Z</PurchaseDate>
<DeviceId>269</DeviceId>
<EntitlementId>001</EntitlementId>
<Vat>18</Vat>
<Currency>BRL</Currency>
<ListPrice inVat="9.9" exVat="8.39" />
<PurchasePrice inVat="9.9" exVat="8.39" />
</TVodPurchase>
<TVodPurchases>
<References>
<ReferencedEntitlements>
<ReferencedEntitlement id="001">
<CreationDate>645645654</CreationDate>
<ProductId>5456566</ProductId>
</ReferencedEntitlement>
</ReferencedEntitlements>
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
ou pode ser o
001 que é igual o id da
TVodPurchase id
Vou dar as dicas:
O valor .valueOf("@nomeAtributo"); PEGA o id?
ReferencedEntitlement id=“001”
ex:
String id = noh.valueOf("@id");
mais aqui eu estou dentro do CustomerId, eu tenho que criar outro for
deste org.jaxen.XPath xpathCustomer = new Dom4jXPath("//vodusage:ReferencedEntitlement")
porque primeiro eu preciso do id do ReferencedEntitlement
Você pode dar .getParent() para pegar o pai do CustomerId, não? Não é desse que você quer?
é o pai seria ("//vodusage:ReferencedEntitlement") né ;D
Sim, e não
O pai seria o específico para aquele customer que você está removendo…
O // busca por QUALQUER elemento, em qualquer lugar do XML…
rsrs mais se eu dar o getParent() ele me retorna o ReferencedEntitlement né?
Element pai = noh.getParent();
ai para pega id
eu faço
String id = pai.valueOf("@id");
ai eu tenho o id
.selectNodes("//TVodPurchase[@id="+id+"]");
antes do ponto qual no eu uso, tenho que criar um?
ficaria assim
Para dar o selectNodes, que eu lembre, pode ser qualquer um (todos estão ligados à raiz). Mas se não der certo, coloca no document mesmo.
ficaria assim?
Map<String, String> map = new HashMap<String, String>();
map.put("vodusage", "urn:eventis:vodusage:2.0");
org.jaxen.XPath xpathCustomer = new Dom4jXPath(
"//vodusage:ReferencedEntitlement/vodusage:CustomerId");
xpathCustomer.setNamespaceContext(new SimpleNamespaceContext(map));
Map<String, String> mapPurchase = new HashMap<String, String>();
map.put("vodusage", "urn:eventis:vodusage:2.0");
org.jaxen.XPath xpathPurchase = new Dom4jXPath("//vodusage:TVodPurchase/vodusage:EntitlementId");
xpathPurchase.setNamespaceContext(new SimpleNamespaceContext(
mapPurchase));
List<Element> nodesCustomer = xpathCustomer.selectNodes(doc);
for (Element noh : nodesCustomer) {
String texto = noh.getTextTrim();
if (texto != null && texto.endsWith("038")) {
Element pai = noh.getParent();
String id = pai.valueOf("@id");
Element purchase = (Element) xpathPurchase.selectNodes("//TVodPurchase[@id='"+id+"']");
purchase.getParent().detach();
noh.getParent().detach();
}
}