Java 对格式不正确的XML的XPath求值?

Java 对格式不正确的XML的XPath求值?,java,xml,xpath,Java,Xml,Xpath,我需要通过XPath计算器传递一些格式不严格的XML。XML实际上主要是html,可能如下所示: <p> <a href="http://www.something.com/5993810749/" title="IMG_3013”> <img src="5993810749_107ea7d465_m.jpg" width="240" height="160" alt="IMG_3013”/> </a> </p> <

我需要通过XPath计算器传递一些格式不严格的XML。XML实际上主要是html,可能如下所示:

<p>
  <a href="http://www.something.com/5993810749/" title="IMG_3013”>
    <img src="5993810749_107ea7d465_m.jpg" width="240" height="160" alt="IMG_3013”/>
  </a>
</p>
<p>
  <a href="http://www.something.com/836492365986/" title="IMG_3018”>
    <img src=“8364923659_107ea3286465_m.jpg" width=“365" height=“248" alt="IMG_3018”/>
  </a>
</p>

所以,我想知道,处理这个问题的最佳方法是什么,这样我才能成功地评估XML?看起来我至少有两个选择:(a)尝试让XPath计算器更加智能;或者(b)尝试用一种方法自动修复格式不好的XML。如能解决此问题,将不胜感激

您可以使用HTML解析器(例如)解析HTML,然后在生成的DOM树上运行XPath查询

import org.cyberneko.html.parsers.DOMParser;
import org.w3c.dom.Document;
import org.w3c.dom.Node;

DOMParser parser = new DOMParser();
parser.parse(new InputSource(new StringReader(xmlString)));
XPath xPath = XPathFactory.newInstance().newXPath();
Object result = xPath.evaluate(xpath, parser.getDocument(),
      XPathConstants.NODESET);

请注意,默认情况下,NekoHTML生成特定的HTMLDOM节点,这些节点以大写形式报告其节点名称,而不考虑原始输入标记的大小写。因此,如果您想要一个能够提取所有
元素的XPath,那么您需要
//p
而不是
//p

有几个实用程序可以将HTML或通常带有尖括号的任何内容转换为格式良好的XML(可能是也可能不是您期望的XML,但它的格式良好)。JTidy和TagSoup经常用于此角色。您不必具体化XML,您可以将其直接导入处理管道中的下一步,例如XSLT转换或模式验证。

如果XML格式不正确,它将不会解析。如果它不能解析,你就不能查询它-XPath或其他。你可以在这里找到合适的库:好的,如果格式不好的XML不能工作,至少有没有办法修复文本以便它可以解析?重要的是获得一个可用的DOM树。有一些HTML解析器,如NekoHTML,可以解析非XML HTML文档并生成合适的DOM,然后您可以在其上运行XPath查询。如果使用Neko,需要注意的一点是DOM树中的元素名将是大写的,因此必须使用xpath,比如
//P/A/IMG
,而不是
//P/A/IMG
。除了每个
中的一些无效引号字符和缺少根元素之外,这个特定的代码片段看起来格式良好。如果这些是唯一的问题,那么简单的字符替换并将其包装在根节点中就可以解决这个问题。
XPath xPath = XPathFactory.newInstance().newXPath();
Object result = xPath.evaluate(xpath,
    new InputSource(new StringReader(xmlString)), XPathConstants.NODESET);
import org.cyberneko.html.parsers.DOMParser;
import org.w3c.dom.Document;
import org.w3c.dom.Node;

DOMParser parser = new DOMParser();
parser.parse(new InputSource(new StringReader(xmlString)));
XPath xPath = XPathFactory.newInstance().newXPath();
Object result = xPath.evaluate(xpath, parser.getDocument(),
      XPathConstants.NODESET);