2

JavaでタグのHTMLコンテンツを変更するにはどうすればよいですか? 例えば:

前:

<html>
    <head>
    </head>
    <body>
        <div>text<div>**text**</div>text</div>
    </body>
</html>

後:

<html>
    <head>
    </head>
    <body>
        <div>text<div>**new text**</div>text</div>
    </body>
</html>

JTidy を試してみましたが、サポートしていませんgetTextContent。他の解決策はありますか?


ありがとう、整形式の HTML を解析したくありません。TagSoup を試しましたが、このコードがある場合:

<body>
sometext <div>text</div>
</body>

「sometext」を「someAnotherText」に変更したいのですが、使用する{bodyNode}.getTextContent()と「sometext text」と表示されます。を使用setTextContet("someAnotherText"+{bodyNode}.getTextContent())してこれらの構造をシリアル化すると、結果はタグ<body>someAnotherText sometext text</body>なし になります。<div>これは私にとって問題です。

4

4 に答える 4

6

HTML が有効で整形式であることを絶対に確信していない限り、TagSoupJerichoNekoHTMLHTML Parserなどの HTML パーサーを使用することを強くお勧めします。くだらない :)

たとえば、HTML パーサーでは (実装が非常に簡単であるため)、Visitorを使用して、独自の を提供しますNodeVisitor

public class MyNodeVisitor extends NodeVisitor {
    public MyNodeVisitor() {
    }

    public void visitStringNode (Text string)
    {
        if (string.getText().equals("**text**")) {
            string.setText("**new text**");
        }
    }
}

次に、 を作成しParser、HTML 文字列を解析して、返されたノード リストにアクセスします。

Parser parser = new Parser(htmlString);
NodeList nl = parser.parse(null);
nl.visitAllNodesWith(new MyNodeVisitor());
System.out.println(nl.toHtml());

これは、これを実装する 1 つの方法にすぎません。かなり簡単です。

于 2009-12-19T22:50:35.540 に答える
4

HTML が整形式の XML である場合 (そうでない場合は、JTidy を使用して整理できます)、DOM または SAX パーサーを使用して解析できます。ドキュメントが大きくない場合は、DOM の方がおそらく簡単です。

テキストが id="id" を持つノードの唯一の子である場合、次のようなことがうまくいきます。

Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
Element e = d.getElementById("id");
Node text = e.getFirstChild();
text.setNodeValue(process(text.getNodeValue());

後で d をファイルに保存できます。

于 2009-12-19T22:02:13.813 に答える
0

ここにリストされているオープン ソースの Java HTML パーサーが多数あります。

何が最も一般的に使用されているかはわかりませんが、これ(単に HTML パーサーと呼ばれます) はおそらくあなたが望むことを行うでしょう。ツリーを変更して書き戻す機能があります。

于 2009-12-19T22:10:29.810 に答える