Regex com XML?

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:

[code]Vendo: 545645645213038(545645645213038)
Removendo
dfsfsdf
sdfsdfsd
545645645213038

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:

[code]Vendo: 545645645213038(545645645213038)
Removendo
dfsfsdf
sdfsdfsd
545645645213038

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:

  • Para pegar o valor do atributo: .valueOf("@nomeAtributo");
  • Para pegar elementos com um atributo com valor específico: .selectNodes("//TVodPurchase[@id=‘001’]");
    • Vide link do XPath que eu passei antes…

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 :slight_smile:

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();
			}
		}