java dom xhtml

非完全なXMLであるxhmlをjqueryみたいにはまるで当たり前のようには使えないのでhtmlcleanerで一旦SAXパーサがエラーになりそうな部分は予め潰す http://htmlcleaner.sourceforge.net/

htmlcleaner

2.2系になりmavenレポジトリに登録されたようだ
pom.xmlに追加実際に利用しているpom.xml: http://bazaar.launchpad.net/~ryoji-kodakari/tiddlywikisplitter/ts/view/head:/pom.xml (自前でインストールしたので少し違うinstall maven library manually)

<dependency>
	<groupId>net.sourceforge.htmlcleaner</groupId>
	<artifactId>htmlcleaner</artifactId>
	<version>2.2</version>
</dependency>

dom4j

パーサにもいろいろあるがこれを使っている
pom.xml

		<dependency>
			<groupId>dom4j</groupId>
			<artifactId>dom4j-core</artifactId>
			<version>1.4-dev-8</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>jaxen</groupId>
			<artifactId>jaxen</artifactId>
			<version>1.1.1</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>saxpath</groupId>
			<artifactId>saxpath</artifactId>
			<version>1.0-FCS</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>

必要になるのはdom4jのみではない

ファイルからw3c dom

    public Document getDom(final File f)
    {
        LOG.info("{}>{}", "getting dom from tiddlywiki.html:", f);
        Document document = null;
        try
        {
            final InputStream is = new FileInputStream(f);
            final InputStreamReader isr = new InputStreamReader(is, "utf8");
            final HtmlCleaner cleaner = new HtmlCleaner();
            final CleanerProperties props = cleaner.getProperties();
            props.setAdvancedXmlEscape(false);
            final TagNode tagNode = cleaner.clean(isr);
            document = new DomSerializer(props, true).createDOM(tagNode);
        }
        catch (final Exception e)
        {
            e.printStackTrace();
        }
        return document;
    }

テキストからdom4j.documentへ1

        org.dom4j.Document document = null;
        try
        {
            document = DocumentHelper.parseText(xml);
        }
        catch (final DocumentException e)
        {
            e.printStackTrace();
        }
        return document;

テキストからdom4j.documentへ 2

    public Document getDom(final String str)
    {
        Document document = null;
        try
        {
            final HtmlCleaner cleaner = new HtmlCleaner();
            final CleanerProperties props = cleaner.getProperties();
            final TagNode tagNode = cleaner.clean(new StringReader(str));
            document = new DomSerializer(props, true).createDOM(tagNode);//w3c dom
            final Transformer transformer = TransformerFactory.newInstance().newTransformer();
            final Source source = new DOMSource(document);
            final Result output = new StreamResult(System.out);
            transformer.transform(source, output);//dom4j
        }
        catch (final Exception e)
        {
            e.printStackTrace();
        }
        return document;
    }

URLからw3c dom

http://bazaar.launchpad.net/~ryoji-kodakari/newsrecorder/newsrecorder-binary/view/head:/src/main/java/jp/newsrecorder/net/GetImpl.java

        Document document = null;
        try
        {
            final URL url = new URL(url_s);
            final URLConnection urlConnection = url.openConnection();
            final InputStream is = urlConnection.getInputStream();
            final InputStreamReader isr = new InputStreamReader(is, charset);
            final HtmlCleaner cleaner = new HtmlCleaner();
            final CleanerProperties props = cleaner.getProperties();
            props.setAdvancedXmlEscape(false);
            final TagNode tagNode = cleaner.clean(isr);
            document = new DomSerializer(props, true).createDOM(tagNode);
        }
        catch (final Exception e)
        {
            e.printStackTrace();
        }

実体参照への変換について

デフォルトで、必要かどうかを判断して一律に実体参照にしなかったりするためエンコードを繰り返すと実体参照が揃ってしまっってデコードが不能になる。

            final CleanerProperties props = cleaner.getProperties();
            props.setAdvancedXmlEscape(false);

これで例外なく&amp;が&amp;amp;に全てする。
これでreplace("&amp;","&");でデコードが成立する。

関連 java dom4j w3cdom
    last modified: 23 July 2011 [ View wiki source Close ]
     
SEARCH DIFFERENCE ATTACHMENT RECENT POST