【问题标题】:How to suppress java xpath error如何抑制java xpath错误
【发布时间】:2012-10-29 07:40:58
【问题描述】:

当我运行下面收到的代码时:

[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();
        }

    }
}

【问题讨论】:

    标签: java xml xpath xml-parsing


    【解决方案1】:

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

    为了解决这个问题,你将不得不找到一些其他的方法来解析你的输入流,因为当你解析那个字符串时,被调用的解析器是一个 XML 解析器,并且 XML 解析器没有“忽略错误” " 选项定义。只允许有效输入;解析器的规范表明格式错误的输入会导致致命异常。

    因此,另一种选择是使用不同的解析器。那里有几个。例如,您可以使用JTidy。尽管它将 HTML 解析为 HTML DOM,但您可以使用一点胶水代码将其转换为适用于解析。见Question 3361263, Library to query HTML with XPath in Java

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我试图操纵你的 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-03-24
          • 2011-07-25
          • 1970-01-01
          • 2023-03-19
          • 2017-03-02
          • 2018-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多