2014-03-27 77 views
2

我想做一些類似於XMLStreamReader的示例@BlaiseDoughan在他對JAXB filtered parsing的迴應中給出的,但是我需要根據子元素進行過濾決策,而不是基於當前節點屬性。使用XMLStreamReader和StreamFilter過濾出基於子元素的元素

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<>(); 
    } 
} 

回答

2
+0

日Thnx您的反饋。因此,採用這種方法,您建議聽衆已附加到Gump的解組,並且我認爲需要迭代和移除符合過濾標準的元素。如果這樣的方法覺得效率不高,那麼一個解決方案會在解組期間遇到流處理時將其丟棄/過濾掉。是這種情況還是我錯過了什麼? – NBW

+1

@NBW - StAX是一種自頂向下的解析器,因此您無法根據子項排除父項,因爲您無權訪問子項。它們的表現歸結爲更快:「解組然後拋棄」vs「存儲查看它們然後應用它們的XML事件的過程」。 –

+0

不錯,再次感謝。我正在試驗這個過程。 – NBW