通过Java读取XML、替换文本并写入相同的XML文件

通过Java读取XML、替换文本并写入相同的XML文件,java,xml,xalan,Java,Xml,Xalan,目前我正在尝试一些非常简单的事情。我正在浏览一个XML文档,查找某个短语,并试图替换它。我遇到的问题是,当我读取这些行时,我会将每一行存储到StringBuffer中。当我将它写入文档时,所有内容都写在一行上 这是我的代码: File xmlFile = new File("abc.xml") BufferedReader br = new BufferedReader(new FileReade(xmlFile)); String line = null; while((line = br.r

目前我正在尝试一些非常简单的事情。我正在浏览一个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”不起作用

提前谢谢


另外,我想一定有一种方法可以在我写入XML文件后使用Xalan对其进行格式化。不知道怎么做。

读线读取换行符之间的所有内容,因此当您写回时,换行符显然丢失了。这些字符取决于操作系统:windows使用两个字符换行,unix使用一个字符。要与操作系统无关,请检索系统属性“line.separator”:

并将其附加到stringbuffer:

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

按照Brel的建议进行了修改,您的文本替换方法应该可以工作,并且对于简单的应用程序来说,它可以很好地工作

如果事情开始变得有点复杂,您最终希望根据元素在XML结构中的位置来选择元素,并且如果您需要确保更改元素文本而不是标记文本(想想
abc
),那么您需要召集骑兵,用XML解析器处理XML


基本上,您可以使用
DocuemntBuilder
读取
文档
,在文档的节点上跳来跳去,做您需要做的事情,然后要求
文档
将自身写回文件。还是问解析器?无论如何,大多数XML解析器都有一些选项可以让您格式化XML输出:您可以为每个开始标记指定缩进(或不缩进)和可能的换行符,诸如此类,以使XML看起来漂亮。
Sb
将是
StringBuffer
对象,在本例中没有实例化。这可以添加到
while
循环之前:

StringBuffer sb =  new StringBuffer();

另一种可能是使用
PrintWriter
及其
println
方法,该方法将自动将系统正确的行终止符附加到任何字符串输出。事实上,我认为这是将行写入输出文件的“标准”方式。我们假设已经创建了
StringBuffer
的实例。这无助于回答这个问题。建议您再次阅读该问题。@rayryeng:-在一个答案中添加了StringBuffer实例,该答案本身就是询问变量“sb”,您可以将其作为注释。但它仍然没有建设性地回答这个问题。不管怎样,谢谢你把事情弄清楚。FWIW-这个答案被删除了,因为它是一个没有建设性的答案。它正在寻求澄清,这也应该作为评论。欢迎来到StackOverflow。为了给OP提供一个他能理解和使用的解决方案,请正确格式化您的代码。此外,您必须解释您的代码您做了什么以及为什么,以便OP了解他的问题是如何通过您的解决方案得到解决的。
StringBuffer sb =  new StringBuffer();
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();
    }
}