gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 02:09:01 24 4
gpt4 key购买 nike

XMLBeam是一个很好的 XML 到 POJO 解码器(通过 XPath),但它只允许您配置 DocumentBuilder 或 DocumentBuilderFactory。

TagSoup是一个很好的 SAX 解析器,可以让您像解析 XML 一样解析讨厌的 HTML 文档。

我想使用 TagSoup 作为 XMLBeam 的 XML 解析器,这样我就可以使用 XPath 将讨厌的 HTML 解码为 POJO。

有没有一种方法可以转换或包装 SAX 解析器,以便我可以将其用作 DocumentBuilder 或 DocumentBuilderFactory?

最佳答案

您可以将 SAX 包装在 DocumentBuilder 中。 XMLBeam 只使用了 DocumentBuilder 的 parse(InputSource) 方法,所以非常简单:

import org.ccil.cowan.tagsoup.Parser;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.xml.sax.*;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.sax.SAXSource;
import java.io.IOException;

public class MyDocumentBuilder extends DocumentBuilder {

@Override
public Document parse(InputSource inputSource) throws SAXException, IOException {

XMLReader xmlReader = new Parser();
xmlReader.setFeature(Parser.namespacesFeature, false);
xmlReader.setFeature(Parser.namespacePrefixesFeature, false);

try{
Transformer transformer = TransformerFactory.newInstance().newTransformer();
DOMResult domResult = new DOMResult();
transformer.transform(new SAXSource(xmlReader, inputSource), domResult);
return (Document) domResult.getNode();
}
catch(Exception exp){
throw new RuntimeException("Error parsing with Tagsoup");
}
}

@Override
public void setErrorHandler(ErrorHandler errorHandler) {

}

@Override
public Document newDocument() {
return null;
}

@Override
public void setEntityResolver(EntityResolver entityResolver) {

}

@Override
public boolean isValidating() {
return false;
}

@Override
public DOMImplementation getDOMImplementation() {
return null;
}

@Override
public boolean isNamespaceAware() {
return false;
}
}

然后,您可以在其他地方告诉 XMLBeam 使用您的 DocumentBuilder:

    XMLFactoriesConfig xmlFactoriesConfig = new DefaultXMLFactoriesConfig(){
@Override
public DocumentBuilder createDocumentBuilder() {
return new MyDocumentBuilder();
}
};

XBProjector xbProjector = new XBProjector(xmlFactoriesConfig);

关于java - 当我需要 DocumentBuilder 时使用 SAX 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22595804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com