0

Java の文字列の java.Util.List のように表される多くの html ページ (つまり、そのソース コード) があります。Java の Document オブジェクトに変換する必要があります (パッケージ org.w3c.dom から)。

DocumentBuilderFactory と Document を使用して、次のようにします。

public static org.w3c.dom.Document inputStream2Document(InputStream inputStream) throws IOException, SAXException, ParserConfigurationException {
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setValidating(false);
    org.w3c.dom.Document parse = dbf.newDocumentBuilder().parse(inputStream);
    return parse;
}   

一部のページは正しい方法で変換されますが、他のページには間違った属性が記述されているなどの問題があり、有効ではありません (="" のない属性 ... のように見えます)。

<a href="somepage.html" someattr>

「someattr」と呼ばれる誤って書かれた属性の場合)。この場合、たとえば例外が発生します

Nested exception: org.xml.sax.SAXParseException; lineNumber: 7558; columnNumber: 71; Element type "a" must be followed by either attribute specifications, ">" or "/>".

また

Nested exception: org.xml.sax.SAXParseException; lineNumber: 109; columnNumber: 32; The string "--" is not permitted within comments.

この例外を無視するように DocumentBuilderFactory に伝える方法はありますか? これらのページもドキュメントに変換したいのですが、それらが無効であることは気にしません。

4

2 に答える 2

1

<a href="somepage.html" someattr>は XML ではないため、XML パーサーで解析することはできませんが、適切なHTMLのように見えるので、XML パーサーの代わりにNekoHTMLなどの HTML パーサーを試すことができます。NekoHTML の使用ページには、完全なドキュメントと HTML のフラグメントの両方を DOM ノードに解析する方法を示す良い例があります。

import org.cyberneko.html.parsers.DOMParser;
import org.xml.sax.InputSource;
import org.w3c.dom.Document;
import java.io.StringReader;

DOMParser parser = new DOMParser();
InputSource in = new InputSource(new StringReader(theHtmlString));
parser.parse(in);
Document doc = parser.getDocument();
于 2013-05-04T15:23:32.053 に答える
0

XML パーサーは、整形式の XML (または、同じ XHTML) のみを解析できます。エラーが発生したページは整形式ではありません。つまり、それらは XML ではないため、XML パーサーは適切ではありません。

ただし、唯一の問題が値のない属性の存在である場合は、入力ファイルを前処理して、正規表現を使用してそれらの属性を削除することを試みることができます。

于 2013-05-04T14:31:25.827 に答える