Копирование файла XML для записи в новый файл XML в Java

Мне было интересно, знает ли кто-нибудь, можно ли использовать один из синтаксических анализаторов XML в Java, чтобы читать строки за строкой, каждую из строк в документе XML и в основном воспроизводить один и тот же документ в другом XML файле? (В моем случае возьмите только строки от точки X до точки Y в документе и скопируйте их). Я думал об использовании буферизованного считывателя и буферизованного сценария в небольшом пробном прогоне, но он не совсем выводил файл должным образом. Ниже приводится то, что я делал в своем пробном прогоне, но это не то, что я хочу. Так кто-нибудь есть опыт с этим или есть какие-либо мысли или предложения, чтобы предложить? Заранее благодарю вас.

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();
 }
}

Рабочий JAVA-код Благодаря Ted Hopp

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();
 }
 }
3 ответа

Если ваш код не скопировал файл должным образом, я предполагаю, что у вас проблема с кодировкой символов. Поскольку кодировка по умолчанию для 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-парсеры будут давать вам элементы (или события элементов), а не строки. Например, они не могут различать различия в белом пространстве:

против

Если ваши требования включают в себя различение этих двух случаев, тогда подход XML-парсера не будет работать.


Если вам просто нужна копия, не делайте ошибки новичков в использовании Reader, но копируйте с помощью InputStream/OutputStream. И даже с читателями, почему вы читали это по строкам? Просто прочитайте буфера-заполнения символов.

Так почему бы не избежать чтения? Поскольку он добавляет накладные расходы на декодирование байтов на символы (и требует, чтобы Writer кодировал от символов к байтам), что для вас не имеет значения. И это также может привести к возникновению проблем, если вы сделаете еще одну распространенную ошибку, не указав кодировку, используемую для Reader или Writer, - которая затем будет использовать любую кодировку по умолчанию для платформы, которая может или не может быть кодировкой, которую использует Файл, который вы читаете.


Вы можете легко связать читателя и писателя с StAX. Используя этот API, вы также можете легко создать фильтр, чтобы извлекать только те части документа, которые вы хотите. Вот несколько ссылок, которые могут помочь:

licensed under cc by-sa 3.0 with attribution.