2013-08-29 2 views
2

У меня есть большой XML, и я хочу обновить определенный узел XML (например, удалять повторяющиеся узлы).Обновление XML с использованием XMLStreamWriter

Поскольку XML огромный, я рассмотрел использование класса api STAX - XMLStreamReader. Сначала я прочитал XML, используя XMLStreamReader. Я сохранил данные чтения в объектах пользователя и манипулировал этими объектами пользователя, чтобы удалить дубликаты.

Теперь я хочу вернуть этот обновленный объект пользователя обратно в свой оригинальный XML. Я думал, что я могу упорядочить объект пользователя на строку и поместить строку в нужную позицию в моем входе xml. Но я не могу этого достичь, используя класс STAX. XML12. Закономер.

Можно ли это сделать с помощью XMLStreamWriter? Пожалуйста, предложите. Если нет, они предлагают альтернативный подход к моей проблеме.

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

+0

Также обратите внимание, что в объектах пользователя (бобы) я загрузил только те разделы, которые мне нужно изменить. Я не загрузил весь XML в компонент, чтобы сохранить память. – deepak

ответ

2

Если вам нужно изменить определенное значение, например, текстовое содержимое/имя тега и т. Д. STAX может помочь. Было бы также помочь в удалении нескольких элементов с помощью createFilteredReader

Ниже кода переименовывает Name к AuthorName и добавляет комментарий

public class StAx { 
    public static void main(String[] args) throws FileNotFoundException, 
      XMLStreamException { 

     String filename = "HelloWorld.xml"; 

     try (InputStream in = new FileInputStream(filename); 
       OutputStream out = System.out;) { 
      XMLInputFactory factory = XMLInputFactory.newInstance(); 
      XMLOutputFactory xof = XMLOutputFactory.newInstance(); 
      XMLEventFactory ef = XMLEventFactory.newInstance(); 

      XMLEventReader reader = factory.createXMLEventReader(filename, in); 
      XMLEventWriter writer = xof.createXMLEventWriter(out); 

      while (reader.hasNext()) { 
       XMLEvent event = (XMLEvent) reader.next(); 
       if (event.isCharacters()) { 
        String data = event.asCharacters().getData(); 
        if (data.contains("Hello")) { 
         String replace = data.replace("Hello", "Oh"); 
         event = ef.createCharacters(replace); 
        } 
        writer.add(event); 
       } else if (event.isStartElement()) { 
        StartElement s = event.asStartElement(); 
        String tagName = s.getName().getLocalPart(); 
        if (tagName.equals("Name")) { 
         String newName = "Author" + tagName; 
         event = ef.createStartElement(new QName(newName), null, 
           null); 
         writer.add(event); 
         writer.add(ef.createCharacters("\n   ")); 
         event = ef.createComment("auto generated comment"); 
         writer.add(event); 
        } else { 
         writer.add(event); 
        } 
       } else { 
        writer.add(event); 
       } 
      } 
      writer.flush(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Входной

<?xml version="1.0"?> 
<BookCatalogue> 
    <Book> 
     <Title>HelloLord</Title> 
     <Name> 
      <first>New</first> 
      <last>Earth</last> 
     </Name> 
     <ISBN>12345</ISBN> 
    </Book> 
    <Book> 
     <Title>HelloWord</Title> 
     <Name> 
      <first>New</first> 
      <last>Moon</last> 
     </Name> 
     <ISBN>12346</ISBN> 
    </Book> 
</BookCatalogue> 

Выход

<?xml version="1.0"?><BookCatalogue> 
    <Book> 
     <Title>OhLord</Title> 
     <AuthorName> 
      <!--auto generated comment--> 
      <first>New</first> 
      <last>Earth</last> 
     </AuthorName> 
     <ISBN>12345</ISBN> 
    </Book> 
    <Book> 
     <Title>OhWord</Title> 
     <AuthorName> 
      <!--auto generated comment--> 
      <first>New</first> 
      <last>Moon</last> 
     </AuthorName> 
     <ISBN>12346</ISBN> 
    </Book> 
</BookCatalogue> 

Как вы можете видеть, что вещи становятся действительно сложными Ted при модификации намного больше, чем это, как замена двух узлов удаление одного узла на основе состояния нескольких других узлов: удалить все книги по цене больше, чем средняя цена

Лучшее решение в этом случае для получения в результате XML с помощью xslt transformation

Смежные вопросы