0

我正在使用 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 吗?

4

1 回答 1

1

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

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

于 2016-11-03T18:22:40.130 回答