XPath对XML格式不正确的评估?

时间:2013-01-21 14:06:08

标签: 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>
<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>

所以,明显的问题是它:没有根元素; <img>也未终止。虽然使用根元素很容易包装,但当我通过XPath求值程序时,我得到一个例外情况:

[Fatal Error] :7:196: The element type "img" must be terminated by the matching end-tag "</img>".

顺便说一下,Java中XPath Evaluator的代码如下:

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

所以,我想知道,处理这个问题的最佳方法是什么,这样我才能成功评估XML?看来我至少有两个选择:(a)尝试让XPath评估者更聪明;或者(b)尝试自动修复格式不正确的XML。这个问题的解决方案将不胜感激!

2 个答案:

答案 0 :(得分:0)

您可以使用HTML解析器(例如NekoHTML)解析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默认生成特定的HTML DOM节点,并且无论原始输入标记的情况如何,它们都会以大写形式报告其节点名称。因此,如果您想要一个将提取所有<p>元素的XPath,那么您需要//P而不是//p

答案 1 :(得分:0)

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