1

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

<p>
  <a href="http://www.something.com/5993810749/" title="IMG_3013”&gt;
    <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”&gt;
    <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。对此问题的解决方案将不胜感激!

4

2 回答 2

0

您可以使用诸如NekoHTML 之类的 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 默认生成特定的 HTML DOM 节点,并且无论原始输入标签的大小写如何,这些节点都以大写形式报告其节点名称。因此,如果您想要一个可以提取所有<p>元素的 XPath,那么您需要//P而不是//p.

于 2013-01-21T14:23:55.127 回答
0

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

于 2013-01-21T15:24:49.713 回答