Копирование XML-файла для записи в новый XML-файл на Java - PullRequest
4 голосов
/ 29 июня 2011

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

КОД JAVA

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 Благодаря Теду Хоппу

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 ]

6 голосов
/ 29 июня 2011

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

3 голосов
/ 29 июня 2011

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

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

1 голос
/ 29 июня 2011

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

...