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

最好的办法是创建自己的 InputStream 版本,将其包裹在 ByteArrayInputStream 周围,以便在数据到达 xpath.evaluate 之前对其进行清理

于 2012-11-09T01:17:04.740 回答
0

首先,XML 与 HTML 不同,XPath 作用于 XML 数据模型。

为了解决这个问题,您必须找到解析输入流的其他方法,因为当您解析该字符串时,调用的解析器是 XML 解析器,而 XML 解析器没有“忽略错误”选项定义。只允许有效输入;解析器的规范说格式错误的输入会导致致命异常。

因此,另一种选择是使用不同的解析器。那里有几个。例如,您可以使用JTidy。尽管它将 HTML 解析为 HTML DOM,但您可以使用一点胶水代码将其转换为适用于解析。请参阅问题 3361263,在 Java 中使用 XPath 查询 HTML 的库

于 2012-11-09T01:17:59.640 回答
0

我试图操纵你的 html,一切都对我有用。我确认当我尝试 XpathEvaluate 时我也会有一个空值,但这就是我绕过它的方式:)

    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 回答