Как использовать JAXB с HTML?

Я хотел бы разобрать некоторый неприятный HTML-объект Java с использованием JAXB. (Я на 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?

Согласно предложению Блейза, попробовал ниже, но получил 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 ответ

Вы можете получить UnmarshallerHandler из Unmarshaller и установите это как ContentHandler на вашем SAX-парсере. После того, как вы выполните SAX-анализ, получите объект из UnmarshallerHandler,

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

Вот пример этого в моем блоге:

Другие вопросы по тегам