Java:在XMLStreamReader2上设置属性?

时间:2016-11-02 13:23:56

标签: java xml woodstox

我正在使用Woodstox在我的应用程序中传输XML文档。我需要在处理之前在模式中定义元素的默认属性,但是使用Woodstox执行此操作的唯一方法是使用额外的XMLStreamReader将文档读入内存,并使用一些逻辑来编写默认属性,将其写出来到内存中的XML文档,然后将内存中的文档传递给业务逻辑。

我不喜欢这样。我想为每个元素流式传输文档以保持较低的内存占用率,因为文档可能很大并且我在应用程序中运行了多个这样的实例。有没有办法在流式传输文档时将属性注入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 个答案:

答案 0 :(得分:1)

不,我认为没有这样的设施可以注入内容。如果您使用的是事件API(XMLEventReader),则可能会修改元素对象。

但是:使用委托的方法可能有效。您需要覆盖访问属性的所有方法,并保持其他属性的状态。因此,当被问及有多少属性时,您将返回原始计数加注入属性;并且可能在原始之后附加新的。 这听起来可行;您可能还需要覆盖next()以在读取START_ELEMENT时更新状态,在推进后丢弃。