Substituição de strings

10 respostas
renatosilva

Alguém sabe o que posso usar para criar uma função que substitui strings?

Eu preciso:

  • verificar se a string possui quebras de linha e sua posição
  • se tiver eu substituo suas ocorrências por uma quebra mais dois espaços, com exceção da última quebra

É um código de indentação que preciso:

Onde isso

<xml>
<child>
<child>
<child>
</xml>

Vira isso

<xml>
  <child>
  <child>
  <child>
</xml>

10 Respostas

Lucas_Teixeira

sera que nao funcionaria o

string.replaceAll("\n","\n  ");

[]s

aborges

Resolveria… Mas temos q ver q o problema dele eh mais embaixo…

Com ele esta trabalhando com XML, deve-se lembrar q ele pode ter N níveis de hierarquia…

Ele ira utilizar o replaceAll, mas vai precisar de uma logicazinha…

volnei

renato3110:
Alguém sabe o que posso usar para criar uma função que substitui strings?

Eu preciso:

  • verificar se a string possui quebras de linha e sua posição
  • se tiver eu substituo suas ocorrências por uma quebra mais dois espaços, com exceção da última quebra

É um código de indentação que preciso:

Onde isso

<xml>
<child>
<child>
<child>
</xml>

Vira isso

<xml> <child> <child> <child> </xml>

Se você estiver querendo formatar arquivos XML aconselho você a dar uma olhada na API JDom, é só abrir um arquivo e salvá-lo e a identação fica do jeito que você definir.

:wink:

_fs

Com certeza tem jeitos mais bonitos, porém:

public static void main( String[] args )
	{
		String test = "meu\nteste\nsuper\nbacana";
		String[] s = test.split( "\n" );
		
		StringBuffer sb = new StringBuffer();
		
		sb.append( s[ 0 ] );
		for( int i = 1; i < s.length - 1; i++ )
			sb.append( "\n  " + s[ i ] );

		sb.append( "\n" + s[ s.length - 1 ] );
		
		System.out.println( sb );
	}
renatosilva

Caros colegas

Lucas, ajudará bastante o replaceAll

aborges, você está correto, vou precisar de iterações, mas já “sei” como fazer isso. O problema está sendo a parte “atômica” dessa operação, que é essa identação simples que mostrei.

volnei, gostei de sua idéia, mas o problema é que [color=blue]o XML é gerado no código e não oriundo de um arquivo[/color]. E se fosse possível queria evitar criar a estrutura DOM (memória!) apenas para indentar.

[color=blue]Será que existe alguma API que indente uma string XML, preferencialmente sem consumir mais memória do que o interressante?[/color]

Caso exista será interessante para mim, pois poderei gerar o XML sem indentações e quebras de linha, e dar um comando simples a essa API para identação.

Caso não exista, acho que prefiro usar o replaceAll na marra e o código do LIPE…

Por falar em quebras de linha, alguém sabe se [color=blue]o Java 1.4.2 possui quebra multiplataforma (parece que o Tiger tem o %n)?
Como inserir uma quebra de linha Windows 13+10? [/color]
O “\n” que estou usando só gera o caracter 10 (quebra do Linux)

volnei

O JDom tambem tem o SAXParser :slight_smile:

renatosilva

Você pode me dar um exemplo simples de identação?

O JDom é API padrão do Java ou externa?

volnei

renato3110:
Você pode me dar um exemplo simples de identação?

O JDom é API padrão do Java ou externa?

Externa!

www.jdom.org (aqui tambem tem exemplos) :wink:

renatosilva

Pode me dar um exemplo de indentação?

Esse JDom é API padrão do Java ou externa?

renatosilva

Aí volnei, acho que consegui com o replaceAll

A lógica de iterações foi meio complicada mesmo

Estou criando uma parada para gerar XML, tipo o inverso do Apache Commons Digester, eis um exemplo:

XMLFormatter f = new XMLFormatter();
	f.setIndentText(false); // Não indenta conteúdos de texto simples
	f.addDeclaration("<?xml version=\"1.0\"?>");
		                 
	List l = new LinkedList();    	
	l.add("Eva-00");
	l.add("Eva-01");
	l.add("Eva-02");
	l.add("Eva-03");
	l.add("Eva-04");
		 
	System.out.println(f.formatAs(l, "evangelions", "evangelion"));

Que gera a seguinte saída:

<?xml version="1.0"?>
<evangelions>
  <evangelion>Eva-00</evangelion>
  <evangelion>Eva-01</evangelion>
  <evangelion>Eva-02</evangelion>
  <evangelion>Eva-03</evangelion>
  <evangelion>Eva-04</evangelion>
</evangelions>

E chamando setIndentText(True) a saída é:

<?xml version="1.0"?>
<evangelions>
  <evangelion>
    Eva-00
  </evangelion>
  <evangelion>
    Eva-01
  </evangelion>
  <evangelion>
    Eva-02
  </evangelion>
  <evangelion>
    Eva-03
  </evangelion>
  <evangelion>
    Eva-04
  </evangelion>
</evangelions>

Alguém interessado?

Criado 22 de dezembro de 2004
Ultima resposta 22 de dez. de 2004
Respostas 10
Participantes 5