我想使用 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 时则不会。
com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl 是使用 DOM 还是 SAX 来解析 XML?
如何让 JAXB 使用 SAX?
我如何告诉 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/