我想知道是否有人知道是否可以使用Java中的一个XML解析器逐行读取XML文档中的每一行并基本上在另一个XML文件中重现相同的文档? (在我的例子中,只取出文档中从点X到点Y的行并复制它们)。我考虑过在小型试运行中使用bufferedreader和bufferedwriter,但它没有完全正确地输出文件。以下是我在试运行中所做的事情,但这不是我想要的。那么有没有人有这方面的经验或有任何想法或建议提供?提前谢谢。
JAVA CODE
public class IPDriver
{
public static void main(String[] args) throws IOException
{
BufferedReader reader = new BufferedReader(new FileReader("C:/Documents and Settings/user/workspace/Intern Project/Proposals/Converted Proposals/Extracted Items/ProposalOne/word/document.xml"));
BufferedWriter writer = new BufferedWriter(new FileWriter("C:/Documents and Settings/user/workspace/Intern Project/Proposals/Converted Proposals/Extracted Items/ProposalOne/word/tempdocument.xml"));
String line = null;
while ((line = reader.readLine()) != null)
{
writer.write(line);
}
// Close to unlock.
reader.close();
// Close to unlock and flush to disk.
writer.close();
}
}
通过Ted Hopp工作JAVA代码
public class IPDriver
{
public static void main(String[] args) throws IOException
{
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("C:/Documents and Settings/user/workspace/Intern Project/Proposals/Converted Proposals/Extracted Items/ProposalOne/word/document.xml"), "UTF-8"));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:/Documents and Settings/user/workspace/Intern Project/Proposals/Converted Proposals/Extracted Items/ProposalOne/word/tempdocument.xml"), "UTF-8"));
String line = null;
while ((line = reader.readLine()) != null)
{
writer.write(line);
}
// Close to unlock.
reader.close();
// Close to unlock and flush to disk.
writer.close();
}
}
答案 0 :(得分:6)
如果你的代码没有正确复制文件,我猜你有一个字符编码问题。由于XML的默认编码是UTF-8,而FileReader的默认编码是您平台的默认编码,我建议改为:
BufferedReader reader = new BufferedReader(
new InputStreamReader(
new FileInputStream("...input file path..."),
"UTF-8"
)
);
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream("...output file path..."),
"UTF-8"
)
);
XML解析器将为您提供元素(或元素事件),而不是行。例如,他们无法区分空白区域的变化:
<tag attr1="val1" attr2="val2" />
与
<tag attr1="val1"
attr2="val2"
/>
如果您的要求包括区分这两种情况,则XML解析器方法将无效。
答案 1 :(得分:3)
如果你只是想要一个副本,不要让新手使用Reader而是使用InputStream / OutputStream进行复制。即使有读者,你为什么要逐行阅读呢?只需读取满载缓冲区的字符。
那为什么要避免读者?因为它增加了将字节解码为字符的开销(并且要求Writer从字符到字节进行编码),这对您没有任何价值。这也可能引入问题,如果你犯了另一个常见错误,即没有指定用于Reader或Writer的编码 - 那么它将使用任何平台默认编码,这可能编码也可能不编码您正在阅读的文件正在使用。
答案 2 :(得分:1)
您可以轻松地将读者和作者与StAX链接起来。使用该API,您还可以轻松创建过滤器,以仅提取所需文档的各个部分。以下是一些可能有用的链接: