3

我想使用 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 实现?

根据 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"));
4

1 回答 1

1

您可以UnmarshallerHandler从 an获取一个Unmarshaller并将其设置为ContentHandlerSAX 解析器上的。执行 SAX 解析后,从UnmarshallerHandler.

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

我的博客上有一个例子:

于 2014-07-16T23:46:34.450 回答