3

目前我正在尝试一些非常简单的事情。我正在通过 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 我想一定有一种方法可以在我写入 XML 文件后使用 Xalan 格式化它或其他东西。不知道该怎么做。

4

4 回答 4

7

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

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

并将其附加到您的字符串缓冲区:

sb.append(line).append(newline);
于 2010-07-06T16:07:29.580 回答
1

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

如果事情开始变得有点棘手,并且您最终想要根据元素在 XML 结构中的位置来选择元素,并且如果您需要确保更改元素文本而不是标记文本(想想<abc>abc</abc>),那么您会想要调用骑兵并使用 XML 解析器处理 XML。

Document本质上,您使用 a读入a DocuemntBuilder,您在文档的节点上跳来跳去做任何您需要的事情,然后要求 将Document自己写回文件。或者你问解析器?无论如何,大多数 XML 解析器都有一些选项可以让您格式化 XML 输出:您可以为每个开始标记指定缩进(或不指定)以及换行符,这有点像,以使您的 XML 看起来更漂亮。

于 2010-07-06T16:16:06.143 回答
0

Sb将是StringBuffer对象,在此示例中尚未实例化。这可以在while循环之前添加:

StringBuffer sb =  new StringBuffer();
于 2014-07-08T05:14:06.410 回答
-1
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();
    }
}
于 2018-05-22T07:26:37.530 回答