jaxb - 如何在 HTML 中使用 JAXB?

标签 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 实现?

按照 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"));

最佳答案

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

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

我的博客上有这样的例子:

关于jaxb - 如何在 HTML 中使用 JAXB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24791422/

相关文章:

java - JAXB 编码失败 : "null" error when running an application on websphere. 相同的应用程序在 Tomcat 上运行良好

java - SAXParserFactory 与XMLReaderFactory 的区别。选择哪一个?

rest - 有什么方法可以将JAXB XML实体中的两个链接映射到不同的类?

jaxb - 通过 wsimport 使用 JAXB 剧集文件

java - 架构验证,如何显示用户友好的验证消息?

java - 在JAVA中如何跳转到XML中的特定节点?

java - 具有 TagSoup 和不间断空格值的 Groovy XmlSlurper

java - 当我需要 DocumentBuilder 时使用 SAX 解析器

java - tagoup 破坏了良好的 xml

java - 使用命名空间解码 XML 响应