Replace dentro xml[RESOLVIDO]

Galera, bom dia!
Estou lendo um .xml e estou entrando na linha que eu quero, porém não consigo fazer um replace para pegar só os valores que estao dentro do CDATA
Segue o código se alguém puder me ajudar…tentei usar REGEX ,mas não consegui.Obrigada desde já!

Minha linha: <![CDATA[51010C05000000000000000000000000000]]
Erro: Unclosed character class near index 9 ![CDATA[]]

String stringao = null; BufferedReader reader1 = new BufferedReader(new FileReader("entrada.xml")); while (reader1.ready()) { stringao = reader1.readLine().replaceAll("\t", ""); if (stringao.startsWith("<![CDATA[") && !stringao.equals("")) { String teste = stringao.replaceAll("![CDATA[]]", "");//aqui que dá erro String cdServico = stringao.substring(0,2); //painelDadosApoliceProposta.getJTextFieldCia().setText(cdServico); } }

RESOLUÇÃO:

[code] String cdServico = null;
String stringao = “<[CDATA[51010C050000]]>”;
Pattern p = Pattern.compile("[0-9][(*[0-9a-zA-Z])]");
Matcher m = p.matcher(stringao);
boolean b = false;
StringBuilder retorno = new StringBuilder();
while(b = m.find()){
retorno.append(m.group());
cdServico = retorno.substring(0,2);//51
}

    //System.out.println(retorno.toString());
    System.out.println(cdServico);[/code]

Por que você não lê o XML através do DOM, ou invés de tentar parsea-lo diretamente?

Ao postar código, por favor, use a tag code:

Seu código aqui

Senão fica bem difícil entender o que você escreve.

Opa acertei la…mas com DOM nao é mais dificil???

Olha, esse teu CDATA parece estar um tanto quanto estranho, o formato correto é:

<![CDATA[ blablabla ]]>

Digo, faltou fechar o CDATA, pela linha que tu colocou alí em cima.

Sobre ler o XMl, a melhor maneira é usar XPath. Você já pensou em utilizá-lo?! Tem vários exemplos aí no google que podem te ajudar.

Acredito que tu terás bem menos linhas de código e ele ficara bem mais legível, bonito e fácil :slight_smile:

Abraço

Eu tentei fazer stringao.replaceAll("<[CDATA[]]>", “”);…mas nao deu certo.
Erro:
Unclosed character class near index 10
<[CDATA[]]>

O replaceAll recebe como primeiro argument uma expressão regular, então tens que formatar uma.

Tem o quote do Pattern que ajuda a fazer isto:


String regexCDATA = Pattern.quote("<![CDATA[]]>");

stringao.replaceAll(regexCDATA, "");

Obrigada pela ajuda ele parou de dar erro,mas nao tira a tag.
Para testar:

	            [code]    String stringao = "<[CDATA[51010C050000]]>";		  
			String regexCDATA  = Pattern.quote("<![CDATA[]]>");
			stringao = stringao.replaceAll(regexCDATA, "");	  
			String cdServico = stringao.substring(0,2);// deve retornar 51
			System.out.println(cdServico);[/code]

Eu acho com o DOM muito mais fácil. Até porque é ele que cuida desses detalhes para você.

A tendência é que esse xml se torne mais e mais detalhado a medida que os anos passarem, então, é bom usar estruturas apropriadas para trabalhar com XML desde o início.

Dá uma lida aqui, Monike:
http://www.ibm.com/developerworks/library/x-wxxm35.html

String cdServico = null;
	String stringao = "<[CDATA[51010C050000]]>";
    Pattern p = Pattern.compile("[0-9][(*[0-9a-zA-Z])]");
    Matcher m = p.matcher(stringao);
    boolean b = false;
    StringBuilder retorno = new StringBuilder();
    while(b = m.find()){
        retorno.append(m.group());   
        cdServico  = retorno.substring(0,2);//51
    }
   
    //System.out.println(retorno.toString());
    System.out.println(cdServico);