我需要通过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。这个问题的解决方案将不胜感激!
答案 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转换或模式验证。