2009-10-07 62 views
3

我刚刚更新到十月份发布的jtidy的最新版本,它似乎因未知原因破坏了我的文档对象。这是我的代码:JTidy升级破解了文档xpaths

tidy = new Tidy(); 
tidy.setShowWarnings(false); 
tidy.setShowErrors(0); 
tidy.setQuiet(true); 
tidy.setMakeClean(true); 

URL url = new URL(url_string); 
Document doc = tidy.parseDOM(url.openStream(), null); 

String xpath_string = "//table[@id='links']//a"; 
XPath xpath = XPathFactory.newInstance().newXPath(); 
XPathExpression expr = xpath.compile(xpath_string); 
NodeList n = (NodeList)expr.evaluate(doc, XPathConstants.NODESET); 

这是我收到的错误:

javax.xml.transform.TransformerException: -1 
    at com.sun.org.apache.xpath.internal.XPath.execute(Unknown Source) 
    at com.sun.org.apache.xpath.internal.XPath.execute(Unknown Source) 
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.eval(Unknown Source) 
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.eval(Unknown Source) 
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.evaluate(Unknown Source) 
    at IndoorClimbing.main(IndoorClimbing.java:55) 
Caused by: java.lang.ArrayIndexOutOfBoundsException: -1 
    at com.sun.org.apache.xml.internal.dtm.ref.ExpandedNameTable.getType(Unknown Source) 
    at com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBase.indexNode(Unknown Source) 
    at com.sun.org.apache.xml.internal.dtm.ref.dom2dtm.DOM2DTM.addNode(Unknown Source) 
    at com.sun.org.apache.xml.internal.dtm.ref.dom2dtm.DOM2DTM.nextNode(Unknown Source) 
    at com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBase._firstch(Unknown Source) 
    at com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBase.getFirstChild(Unknown Source) 
    at com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBaseTraversers$ChildTraverser.first(Unknown Source) 
    at com.sun.org.apache.xpath.internal.axes.AxesWalker.getNextNode(Unknown Source) 
    at com.sun.org.apache.xpath.internal.axes.AxesWalker.nextNode(Unknown Source) 
    at com.sun.org.apache.xpath.internal.axes.WalkingIterator.nextNode(Unknown Source) 
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.nextNode(Unknown Source) 
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.runTo(Unknown Source) 
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.setRoot(Unknown Source) 
    at com.sun.org.apache.xpath.internal.axes.LocPathIterator.execute(Unknown Source) 
    ... 6 more 
--------- 
java.lang.ArrayIndexOutOfBoundsException: -1 
    at com.sun.org.apache.xml.internal.dtm.ref.ExpandedNameTable.getType(Unknown Source) 
    at com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBase.indexNode(Unknown Source) 
    at com.sun.org.apache.xml.internal.dtm.ref.dom2dtm.DOM2DTM.addNode(Unknown Source) 
    at com.sun.org.apache.xml.internal.dtm.ref.dom2dtm.DOM2DTM.nextNode(Unknown Source) 
    at com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBase._firstch(Unknown Source) 
    at com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBase.getFirstChild(Unknown Source) 
    at com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBaseTraversers$ChildTraverser.first(Unknown Source) 
    at com.sun.org.apache.xpath.internal.axes.AxesWalker.getNextNode(Unknown Source) 
    at com.sun.org.apache.xpath.internal.axes.AxesWalker.nextNode(Unknown Source) 
    at com.sun.org.apache.xpath.internal.axes.WalkingIterator.nextNode(Unknown Source) 
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.nextNode(Unknown Source) 
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.runTo(Unknown Source) 
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.setRoot(Unknown Source) 
    at com.sun.org.apache.xpath.internal.axes.LocPathIterator.execute(Unknown Source) 
    at com.sun.org.apache.xpath.internal.XPath.execute(Unknown Source) 
    at com.sun.org.apache.xpath.internal.XPath.execute(Unknown Source) 
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.eval(Unknown Source) 
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.eval(Unknown Source) 
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.evaluate(Unknown Source) 
    at IndoorClimbing.main(IndoorClimbing.java:55) 
--------------- linked to ------------------ 
javax.xml.xpath.XPathExpressionException 
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.evaluate(Unknown Source) 
    at IndoorClimbing.main(IndoorClimbing.java:55) 
Caused by: javax.xml.transform.TransformerException: -1 
    at com.sun.org.apache.xpath.internal.XPath.execute(Unknown Source) 
    at com.sun.org.apache.xpath.internal.XPath.execute(Unknown Source) 
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.eval(Unknown Source) 
    at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.eval(Unknown Source) 
    ... 2 more 
Caused by: java.lang.ArrayIndexOutOfBoundsException: -1 
    at com.sun.org.apache.xml.internal.dtm.ref.ExpandedNameTable.getType(Unknown Source) 
    at com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBase.indexNode(Unknown Source) 
    at com.sun.org.apache.xml.internal.dtm.ref.dom2dtm.DOM2DTM.addNode(Unknown Source) 
    at com.sun.org.apache.xml.internal.dtm.ref.dom2dtm.DOM2DTM.nextNode(Unknown Source) 
    at com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBase._firstch(Unknown Source) 
    at com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBase.getFirstChild(Unknown Source) 
    at com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBaseTraversers$ChildTraverser.first(Unknown Source) 
    at com.sun.org.apache.xpath.internal.axes.AxesWalker.getNextNode(Unknown Source) 
    at com.sun.org.apache.xpath.internal.axes.AxesWalker.nextNode(Unknown Source) 
    at com.sun.org.apache.xpath.internal.axes.WalkingIterator.nextNode(Unknown Source) 
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.nextNode(Unknown Source) 
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.runTo(Unknown Source) 
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.setRoot(Unknown Source) 
    at com.sun.org.apache.xpath.internal.axes.LocPathIterator.execute(Unknown Source) 
    ... 6 more 

试图生成节点列表时出现的错误在最后一行代码。有没有人有过新版本的JTidy这样的问题?

回答

4

有类似的问题。发现一个相当愚蠢的解决方法(重新解析jtidy输出),这表明jTidy存在问题。

document = tidy.parseDOM(rstream, null); 

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
Source xmlSource = new DOMSource(document); 
Result outputTarget = new StreamResult(outputStream); 
TransformerFactory.newInstance().newTransformer().transform(xmlSource, outputTarget); 
InputStream is = new ByteArrayInputStream(outputStream.toByteArray()); 

Document doc = db.parse(is); 

花了我几个小时;希望这个hel。。

+0

DANG。这也只是咬我一口。感谢myFriendJoe的努力! – 2010-01-05 00:44:04

0

由于错误发生在com.sun.org.apache,我不认为这是一个JTidy问题。

尝试剥离您的示例,以便您可以针对XalanJ project提交错误报告。