私はこれがここで何度も尋ねられたことを知っています、しかし私はそれを扱う別の問題を抱えています。私の場合、アプリは文字列として渡された整形式ではないdom構造を受け取ります。これがサンプルです:
<div class='video yt'><div class='yt_url'>http://www.youtube.com/watch?v=U_QLu_Twd0g&feature=abcde_gdata</div></div>
ご覧のとおり、内容は整形式ではありません。ここで、通常のSAXまたはDOM解析を使用して解析しようとすると、理解できる例外がスローされます。
org.xml.sax.SAXParseException:エンティティ「feature」への参照は「;」で終わる必要があります デリミタ。
要件に従って、このドキュメントを読み、divタグをいくつか追加して、コンテンツを文字列として送り返す必要があります。これは、入力構造を読み取り、必要な位置にタグを追加できるため、DOMパーサーを使用することでうまく機能します。
JTidyなどのツールを使用して前処理を実行してから解析しようとしましたが、その結果、ドキュメントが本格的なhtmlに変換されてしまいます。これは望ましくありません。サンプルコードは次のとおりです。
StringWriter writer = new StringWriter();
Tidy tidy = new Tidy(); // obtain a new Tidy instance
tidy.setXHTML(true);
tidy.parse(new ByteArrayInputStream(content.getBytes()), writer);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new ByteArrayInputStream(writer.toString().getBytes()));
// Traverse thru the content and add new tags
....
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
StreamResult result = new StreamResult(new StringWriter());
DOMSource source = new DOMSource(doc);
transformer.transform(source, result);
これにより、入力が整形式のhtmlドキュメントに完全に変換されます。そうすると、htmlタグを手動で削除することが難しくなります。私が試したもう1つのオプションは、SAX2DOMを使用することでした。これもHTMLドキュメントを作成します。これがサンプルコードです。
ByteArrayInputStream is = new ByteArrayInputStream(content.getBytes());
Parser p = new Parser();
p.setFeature(IContentExtractionConstant.SAX_NAMESPACE,true);
SAX2DOM sax2dom = new SAX2DOM();
p.setContentHandler(sax2dom);
p.parse(new InputSource(is));
Document doc = (Document)sax2dom.getDOM();
誰かが彼らの考えを共有することができれば私は感謝します。
ありがとう