2009-10-07 46 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提交錯誤報告。