Чтение XML, замена текста и запись в тот же XML-файл через Java - PullRequest
3 голосов
/ 06 июля 2010

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

Вот мой код:

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но, к сожалению, я не знаю, какой символ использовать как "\ n" не работает.

Заранее спасибо!

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

Ответы [ 4 ]

7 голосов
/ 06 июля 2010

readline читает все между символами новой строки, поэтому, когда вы записываете обратно, очевидно, что символы новой строки отсутствуют. Эти символы зависят от ОС: Windows использует два символа для перехода на новую строку, Unix, например, использует один. Чтобы быть независимым от ОС, получите системное свойство "line.separator":

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

и добавьте его в буфер строк:

sb.append(line).append(newline);
1 голос
/ 06 июля 2010

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

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

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

0 голосов
/ 22 мая 2018
Scanner scan = new Scanner(System.in);
String filePath = scan.next();
String oldString = "old_string";
String newString = "new_string";
String oldContent = "";
BufferedReader br = null;
FileWriter writer = null;
File xmlFile = new File(filePath);
try {
    br = new BufferedReader(new FileReader(xmlFile));
    String line = br.readLine();
    while (line != null) {
        oldContent = oldContent + line + System.lineSeparator();
        line = br.readLine();
    }
    String newContent = oldContent.replaceAll(oldString, newString);
    writer = new FileWriter(xmlFile);
    writer.write(newContent);
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        scan.close();
        br.close();
        writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
0 голосов
/ 08 июля 2014

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

StringBuffer sb =  new StringBuffer();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...