2010-07-06 3 views
3

В настоящее время я пытаюсь что-то очень простое. Я просматриваю XML-документ для определенной фразы, на которой я пытаюсь ее заменить. Проблема, с которой я сталкиваюсь, заключается в том, что когда я читаю строки, я храню каждую строку в StringBuffer. Когда я пишу его в документ, все записывается на одной строке.Чтение XML, замена текста и запись в тот же файл XML через Java

Вот мой код:

File xmlFile = new File("abc.xml") 
BufferedReader br = new BufferedReader(new FileReade(xmlFile)); 
String line = null; 
while((line = br.readLine())!= null) 
{ 
    if(line.indexOf("abc") != -1) 
    { 
     line = line.replaceAll("abc","xyz"); 
    }   
    sb.append(line);     
} 
br.close(); 

BufferedWriter bw = new BufferedWriter(new FileWriter(xmlFile)); 
bw.write(sb.toString()); 
bw.close(); 

Я предполагаю, что мне нужен новый символ перевода строки, когда я предпочитаю sb.append, но, к сожалению, я не знаю, какой символ использовать как «\ п» не работает.

Заранее благодарен!

P.S. Я решил, что должен быть способ использовать Xalan для форматирования XML-файла после того, как я напишу ему или что-то еще. Не знаю, как это сделать.

ответ

7

Readline считывает все символы между символами новой строки, поэтому при записи обратно, очевидно, символы новой строки отсутствуют. Эти символы зависят от ОС: для использования новой строки для Windows используются два символа, например, unix использует один. Для OS агностиком, получить системное свойство «line.separator»:

String newline = System.getProperty("line.separator"); 

и добавить его к StringBuffer:

sb.append(line).append(newline); 
+2

Другая возможность заключается в использовании 'PrintWriter' и его' println' метод, который будет автоматически добавляемых системный правильно терминатор линии к любому выходу строки. На самом деле, я бы сказал, что это «стандартный» способ записи строк в выходной файл. –

+0

Удивительная работа! – Bilzac

1

Модифицированный как предложено Бреля, текст заменителя подход должен работать, и он будет работать достаточно хорошо для простых приложений.

Если все начинает становиться немного причудливым, и вы в конечном итоге хотите выбрать элементы на основе их положения в структуре XML, и если вам нужно обязательно изменить текст элемента, но не текст тега (подумайте <abc>abc</abc>), то вы захотите войти в кавалерию и обработать XML с помощью парсера XML.

По существу, вы читаете в Document с помощью DocuemntBuilder, вы прыгаете вокруг узлов документа, делая все, что вам нужно, а затем попросите Document записать себя обратно в файл. Или вы спрашиваете парсер? Во всяком случае, у большинства парсеров XML есть несколько вариантов, которые позволяют отформатировать вывод XML: вы можете указать отступы (или нет) и, возможно, новые строки для каждого открывающего тега, такого рода, чтобы ваш XML выглядел красиво.

+0

благодарит за ответ! – Bilzac

0

Sb будет StringBuffer объект, который не был определен в данном примере. Это может добавлен перед циклом while:

StringBuffer sb = new StringBuffer(); 
+0

Мы предполагаем, что экземпляр 'StringBuffer' уже создан. Это не помогает ответить на вопрос. Предложите снова прочитать этот вопрос. – rayryeng

+0

@ rayryeng: - добавлен экземпляр StringBuffer в связи с одним ответом, который сам спрашивал о переменной «sb» – IntelK

+0

Вы можете оставить это в качестве комментария. Тем не менее, он все еще не отвечает конструктивно. В любом случае, хорошо вам, чтобы все прояснить. – rayryeng