2013-07-12 105 views
1

结构JAXB应该忽略元素

<html> 
    <span><h1>test</h1></span> 
    <table> 

    </table> 
</html> 

我怎样才能文本“测试”如果<span>可能是一个<div>

@XmlAccessorType(XmlAccessType.FIELD) 
public class HtmlTag { 
    @XmlElement(name = "h1") 
    String h1; 
} 

Unmarshalls为null。

回答

1
@XmlAccessorType(XmlAccessType.FIELD) 
public class HtmlTag 
{ 
    @XmlAnyElement 
    List<org.w3c.dom.Element> elements; 
} 

得到test

HtmlTag htmlTag = //... 
Element firstElement = htmlTag.elements.get(0); // this is first element, 
             // currently it is <span> 
firstElement.getElementsByTagName("h1").item(0).getTextContent(); // return 'test' 
+0

...与afterUnmarshal()ok结合使用。 –

0

您可以在一个XMLStreamReader所以要忽略的元素是不能报告为事件充分利用StAX的StreamFilter。然后,您可以使用JAXB从XMLStreamReader解组。

import javax.xml.bind.*; 
import javax.xml.stream.*; 
import javax.xml.transform.stream.StreamSource; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(HtmlTag.class); 

     XMLInputFactory xif = XMLInputFactory.newFactory(); 
     StreamSource xml = new StreamSource("src/forum17613060/input.xml"); 
     XMLStreamReader xsr = xif.createXMLStreamReader(xml); 
     xsr = xif.createFilteredReader(xsr, new StreamFilter() { 

      @Override 
      public boolean accept(XMLStreamReader reader) { 
       if(reader.isStartElement() || reader.isEndElement()) { 
        String localName = reader.getLocalName(); 
        return !"span".equals(localName) && !"div".equals(localName); 
       } 
       return true; 

      } 

     }); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     HtmlTag htmlTag = unmarshaller.unmarshal(xsr, HtmlTag.class).getValue(); 
     System.out.println(htmlTag.h1); 
    } 

}