Java: Как эффективно объединить несколько файлов XML для создания нового XML? - PullRequest
2 голосов
/ 18 января 2010

В Java :
Предположим, у меня есть 3 xml-файла

<student>lin</student> --  file1.xml

<student>Eric</student> --  file2.xml

<student>joe</student> --  file3.xml

Как мне объединить эти xml (учитывая, что у них нет декларации DTD или пространства имен), чтобы создать

<class><student>lin</student> <student>Eric</student>
<student>joe</student> </class> -- file4.xml

класс являющийся узлом обмотки, который я поставляю вручную

Ps : я использовал xstream для создания xml's

Ответы [ 3 ]

2 голосов
/ 18 января 2010

Если ваши файлы большие, я бы использовал SAXParser , где ваш ContentHandler будет отображать теги и содержимое.

Что-то вроде ( псевдокод ):

print("<class>")
foreach(file in files)
  {
  mysaxparser.parse(new Handler() 
     {
     content="";

     void endElement(tag)
         {
          if(tag.equals("student")) print("<student>"+escapeXML(content)+"</student>"); 
         content="";
         }
     void characters(str)
         {
         content+=str;
         }
     },file);
  }
print("</class>");

Если ваши файлы достаточно малы, чтобы поместиться в память: загрузите DOM каждого документа с помощью DocumentBuilder и вызовите importNode , чтобы объединить документы в один.

1 голос
/ 03 мая 2010

Я думаю, что правильный способ сделать это - загрузить три файла в документы DOM, а затем заставить один из них принять узлы из двух других документов, таким образом, все они обрабатываются DOM API и должны быть надежными, вместо текстовых манипуляций.

Этого можно добиться, заглянув в javadoc DomDocument.

1 голос
/ 18 января 2010

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

String[] filenames = new String[]{"header.xml", "file1.xml", "file2.xml", "file3.xml", "footer.xml"};
OutputStream outputStream = new BufferedOutputStream(new FileOutputStream("merged.xml");
for (String filename : filenames) {
    InputStream inputStream = new BufferedInputStream(new FileInputStream(filename);
    org.apache.commons.io.IOUtils.copy(inputStream, outputStream);
    inputStream.close();
}
outputStream.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...