【问题标题】:Filtering out elements based on sub elements with XMLStreamReader and StreamFilter使用 XMLStreamReader 和 StreamFilter 根据子元素过滤掉元素
【发布时间】:2014-05-06 21:27:47
【问题描述】:

我想做一些类似于@BlaiseDoughan 在他对JAXB filtered parsing 的回复中给出的 XMLStreamReader 示例的操作,但是我需要根据子元素而不是当前节点属性做出过滤决定。

XMLStreamReader 没有像 XMLEventReader 这样的 peek API。例如,我想将以下 XML 解组为 Gump 对象,其记录列表最终仅包含 1 项,其关联名称不以“Filtered-”开头的记录。

我正在使用 Eclipselink 2.3.2v20111124-r10461

<gump>
    <foo>Some text</foo>
    <bar>1.245</bar>
    <records>
        <record>
            <name>Filtered-Counter</name>
            <value>1</value>
        </record>
        <record>
            <name>Golden</name>
            <value>shiny</value>
        </record>
    </records>
    <baz>1234</baz>
</gump>

Gump.java

@XmlRootElement(name = "gump")
@XmlAccessorType(XmlAccessType.FIELD)
public class Gump implements Serializable {

    private String foo;
    private String bar;
    private String baz;

    @XmlElementWrapper
    @XmlElement(name = "record")
    private List<Record> records;

    // .. Field getters/setters 

    public Gump() {
      records = new ArrayList<>();
    }
}

【问题讨论】:

    标签: xml jaxb eclipselink moxy


    【解决方案1】:

    【讨论】:

    • 感谢您的反馈。因此,使用这种方法,您建议侦听器附加到 Gump 的解组,我认为需要迭代和删除满足过滤条件的元素。如果是这样,这种方法感觉性能会降低,那么当它们在解组期间在流处理中遇到时,丢弃/过滤掉它们的解决方案。是这样还是我错过了什么?
    • @NBW - StAX 是一个自上而下的解析器,因此您无法根据其子级排除父级,因为您无权访问子级。他们归结为更快的性能:Unmarshalling and then throwing away vs A process of storing up XML events looking at them and then applying them
    • 这种方法效果很好。太糟糕了,您不能告诉读者丢弃当前节点,因为在这种情况下,我可以在 Record 上进行回调,告诉读者本质上不要将自己添加到正在构建的 DOM 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多