4

XMLBeamは XML から POJO への優れたアンマーシャラー (XPath 経由) ですが、DocumentBuilder または DocumentBuilderFactory のみを構成できます。

TagSoupは、厄介な HTML ドキュメントを XML であるかのように解析できる優れた SAX パーサーです。

XMLBeam の XML パーサーとして TagSoup を使用して、XPath を使用して厄介な HTML を POJO に非整列化できるようにします。

DocumentBuilder または DocumentBuilderFactory として使用できるように、SAX パーサーを変換またはラップする方法はありますか?

4

1 に答える 1

6

DocumentBuilder で SAX をラップできます。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);
于 2014-03-25T00:38:49.287 に答える