2016-11-02 5 views
0

Я использую Woodstox для передачи XML-документов в мое приложение. Мне нужно установить атрибуты по умолчанию для элементов, как они определены в схеме, прежде чем они будут обработаны, но единственный способ сделать это с помощью Woodstox - прочитать документ в памяти с помощью дополнительного XMLStreamReader с некоторой логикой для записи атрибутов по умолчанию, записать его в XML-документ в памяти, а затем передать документ в памяти в бизнес-логику.Java: установить атрибуты в XMLStreamReader2?

Мне это не нравится. Я хочу, чтобы поток документа на элемент, чтобы сохранить снимок памяти низкий, потому что документы могут быть потенциально большими, и я запускаю несколько экземпляров этого в приложении. Есть ли способ внедрить атрибуты в XMLStreamReader при потоковой передаче документа? Я уже нашел способ, чтобы пропустить через узлы я не заинтересован в то время как потоковый:

public class XMLPreProcessor extends StreamReader2Delegate { 
    public XMLPreProcessor(XMLStreamReader2 sr) { 
     super(sr); 
    } 

    //Skip over all processing instructions 
    //Can this be extended to inject attributes to elements? 
    @Override 
    public int next() throws XMLStreamException { 
     int eventType = super.next(); 

     while(eventType == XMLStreamConstants.PROCESSING_INSTRUCTION) { 
      eventType = super.next(); 
     } 

     return eventType; 
    } 
} 

Может ли этот делегату быть переделан, чтобы придать атрибуты минуты XMLStreamReader?

ответ

1

Нет. Я не думаю, что есть такой объект, чтобы вводить контент. Однако, если вы использовали Event API (XMLEventReader), вы могли бы, вероятно, изменить объекты объектов.

Однако ваш подход, используя делегат, может работать. Вам нужно будет переопределить все методы доступа к атрибутам и сохранить состояние дополнительных атрибутов. Поэтому, когда вас спрашивают, сколько атрибутов есть, вы должны вернуть исходный счет плюс введенные атрибуты; и, вероятно, практически добавить новые после оригинала. Это звучит выполнимо; вам также может потребоваться переопределить next() для обновления состояния, когда START_ELEMENT считывается, отбрасывается после продвижения.

+0

Я закончил перенос делегата с помощью XMLEventReader и переопределил метод 'nextEvent()', чтобы ввести атрибуты по умолчанию для элементов. Существует слишком много методов для переопределения в XMLStreamReader, в сочетании с тем, что он специфичен для реализации, слишком много работы для нишевой функции. Переопределение XMLEventReader проще, и будет легче переписать, если я изменю реализации. – user1428945