Как сделать поиск / замену файла на лету? - PullRequest
1 голос
/ 13 января 2012

Мое java-приложение загружает файл XML, а затем анализирует XML.

Я хотел бы найти / заменить файл перед созданием SAXBuilder. Как я могу сделать это в памяти (без необходимости записи в файл)?

Вот мой код и где я предполагаю выполнить поиск / замену:

private String xmlFile = "D:\\mycomputer\\extract.xml";
File myXMLFile = new File(xmlFile);

// TODO
// REPLACE ALL "<content>" in xmlFile with "<content><![CDATA["
// REPLACE ALL "</content>" with "]]></content>"

SAXBuilder builder =  new SAXBuilder("org.apache.xerces.parsers.SAXParser");

document = builder.build(new File(myXMLFile));

Ответы [ 4 ]

1 голос
/ 13 января 2012

Вы можете сначала прочитать файл в строку с помощью apache commons io , а затем изменить источник ввода для SaxBuilder, как в следующем фрагменте кода:

String fileStr = FileUtils.readFileToString(myXMLFile);
fileStr = fileStr.replaceAll("<content>","<content><![CDATA[");
fileStr = fileStr.replaceAll("</content>","]]></content>");
SAXBuilder builder =  new SAXBuilder("org.apache.xerces.parsers.SAXParser");
document = builder.build(new ByteArrayInputStream(fileStr.getBytes()));
1 голос
/ 13 января 2012

Считайте файл в память, выполните поиск / замену и используйте метод SAXBuilder (StringReader).

1 голос
/ 13 января 2012

Вы сами ответили на вопрос - прочитайте весь файл в StringBuilder, выполните замену в нем и затем вызовите SAXParser.

Строка может быть передана в SAXBuilder с помощью StringReader: StringBuilder sb = new StringBuilder (); loadFIleContent (filePath, sb); document = builder.build (new StringReader (sb.toString ()));

PS: следуйте ответу глаубера:

Если файл действительно большой (~ 100 МБ), нецелесообразно полностью прочитать его в память, а также проанализировать его в дереве DOM.В этом случае вам следует рассмотреть возможность использования SAXParser и замены в качестве анализируемого файла.

0 голосов
/ 13 января 2012

В зависимости от размера этих файлов, либо считайте файл в строку, замените его в памяти и скомпонуйте XML из строки, либо создайте новый поток для чтения файла, выполните замены и выведите, а затем соберитеXML из выходных данных этого потока.

(Я бы предложил проанализировать и изменить дерево XML или использовать фильтр XML, но я подозреваю, что вы хотите сделать эту замену на основе строк, поскольку текущее содержимое ваших файловне правильный XML.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...