如何在HTML中使用JAXB?

时间:2014-07-16 21:51:03

标签: jaxb sax tag-soup

我想使用JAXB将一些令人讨厌的HTML解组为Java对象。 (我在使用Java 7)。

Tagsoup是一个符合SAX标准的XML解析器,可以处理令人讨厌的HTML。

如何设置JAXB以使用Tagsoup来解组HTML?

我尝试设置System.setProperty(“org.xml.sax.driver”,“org.ccil.cowan.tagsoup.Parser”);

如果我创建XMLReader,它使用Tagsoup,但在使用JAXB时则不行。

  1. com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl是否使用DOM或SAX解析XML?

  2. 如何告诉JAXB使用SAX?

  3. 我如何告诉JAXB使用TagSoup作为SAX实现?

  4. 根据Blaise的建议,尝试下面,但在最后一行得到SAXParseException。只使用XMLReader完成解析:

        JAXBContext jaxbContext = JAXBContext.newInstance(Thing.class);
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
    
        XMLReader xmlReader = new org.ccil.cowan.tagsoup.Parser();
    
        xmlReader.parse("file:///c:/test.xml");
        System.out.println("parse ok");
    
        xmlReader.setContentHandler(unmarshaller.getUnmarshallerHandler());
    
        //SAXParseException; systemId: file:/c:/test.xml; lineNumber: 5; columnNumber: 3; The element type "br" must be terminated by the matching end-tag "</br>".
        Thing thing = (Thing) unmarshaller.unmarshal(new File("c:/test.xml"));
    

1 个答案:

答案 0 :(得分:1)

您可以从UnmarshallerHandler获取Unmarshaller并将其设置为SAX解析器上的ContentHandler。执行SAX解析后,从UnmarshallerHandler获取对象。

UnmarshallerHandler unmarshallerHandler = unmarshaller.getUnmarshallerHandler();
xmlReader.setContentHandler(unmarshallerHandler);
xmlReader.parse(...);
Thing thing = (Thing) unmarshallerHandler.getResult();

我的博客上有一个例子: