1

以下のコードを実行すると、次のようになります。

[Fatal Error] :1:1: Content is not allowed in prolog.
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.

文字列でコンテンツが許可されていないことはわかっていますhtmlが、すべてのエラーを抑制したいと思います。

import java.io.ByteArrayInputStream;
import java.io.InputStream;

import org.w3c.dom.*;
import org.xml.sax.InputSource;

import javax.xml.xpath.*;
import javax.xml.parsers.*;
public class Test {

    public static void main(String[] args){
        String html="---<html><div id='teste'>Teste</div><div id='ola'>Ola tudo ebm!</div></html>";

        try{

            XPath xpath = XPathFactory.newInstance().newXPath();
            String xpathExpression = "//div[@id='ola']";

            InputStream is = new ByteArrayInputStream(html.getBytes()); 
            InputSource inputSource = new InputSource(is);

            NodeList nodes = (NodeList) xpath.evaluate
            (xpathExpression, inputSource, XPathConstants.NODESET);

            int j = nodes.getLength();

            for (int i = 0; i < j; i++) {
                System.out.println(nodes.item(i).getTextContent());
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
4

3 に答える 3

0

最善の策は、ByteArrayInputStreamをラップする独自のバージョンのInputStreamを作成して、データがxpath.evaluateに到達する前にデータをサニタイズすることです。

于 2012-11-09T01:17:04.740 に答える
0

まず、XMLはHTMLと同じではなく、XPathはXMLデータモデルで機能します。

これを解決するには、入力ストリームを解析する他の方法を見つける必要があります。これは、その文字列を解析するときに呼び出されるパーサーがXMLパーサーであり、XMLパーサーには「エラーを無視する」オプションがないためです。意味。有効な入力のみが許可されます。パーサーの仕様そのものが、不適切な形式の入力は致命的な例外を引き起こすはずであると述べています。

したがって、別の方法は、別のパーサーを使用することです。そこにいくつかあります。たとえば、JTidyを使用できます。HTMLをHTMLDOMにパーサーしますが、少しのグルーコードでそれを変換できるので、パーシングに適しています。質問3361263、JavaでXPathを使用してHTMLをクエリするライブラリを参照してください。

于 2012-11-09T01:17:59.640 に答える
0

私はあなたのhtmlを操作しようとしましたが、すべてうまくいきました。XpathEvaluateを試みたときにnull値もあったことを確認しましたが、これが私がそれをバイパスした方法です:)

    try {

        Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File("D:\\Loic_Workspace\\Test2\\res\\test.xml"));


        Integer length = doc.getElementsByTagName("div").getLength();


        if(length != null){

            for(int i=0;i<length;i++){


                if(doc.getElementsByTagName("div").item(i).getAttributes().item(0).getTextContent().equals("ola")){
                    System.out.println(doc.getElementsByTagName("div").item(i).getTextContent());
                }



            }


        }





    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ParserConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

コンソールの出力: Ola tudo ebm!

doc.getElementsByTagName("div").item(i).getAttributes().item(0) --> ドキュメント内の「id」属性の参照です。この要素のテキスト コンテンツを .getText() メソッドで取得します。

私はそれが最も効率的な方法ではないことを知っていますが、うまくいきます:)

それが役立つことを願っています、

于 2012-12-05T02:50:27.483 に答える