0

この関数では、Xpath を使用して以下のようにノードの位置を取得する関数があります。

   Node goTo;
.....


private Node xpathgo(Node node) throws XPathExpressionException {
       XPath xpath = XPathFactory.newInstance().newXPath();
       Node result;

 if (node == null || node.getNodeName() == null){
            return null;
        }

               xpathgo(node.getFirstChild());


               result =   (Node) xpath.evaluate("//*[. = \"" + goTo.getNodeValue() + "\"]", node,XPathConstants.NODE);


            xpathgo(node.getNextSibling());
 return  result;   
}

基本的に、これを使用して、URL html コードから作成された DOM のノードを取得しますが、2 つの問題に直面します。まず、この例外が発生することがあります。

Exception in thread "main" java.lang.RuntimeException: Could not resolve the node to a handle
    at com.sun.org.apache.xml.internal.dtm.ref.DTMManagerDefault.getDTMHandleFromNode(DTMManagerDefault.java:574)
    at com.sun.org.apache.xpath.internal.XPathContext.getDTMHandleFromNode(XPathContext.java:182)
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:301)
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.eval(XPathImpl.java:210)
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:275)

また、これは他の種類のノード用です。

Caused by: javax.xml.transform.TransformerException: Expected ], but found: the
at com.sun.org.apache.xpath.internal.compiler.XPathParser.error(XPathParser.java:608)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.consumeExpected(XPathParser.java:526)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.Predicate(XPathParser.java:1935)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.Step(XPathParser.java:1724)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelativeLocationPath(XPathParser.java:1624)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.LocationPath(XPathParser.java:1595)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.PathExpr(XPathParser.java:1315)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnionExpr(XPathParser.java:1234)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnaryExpr(XPathParser.java:1140)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.MultiplicativeExpr(XPathParser.java:1061)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.AdditiveExpr(XPathParser.java:1003)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelationalExpr(XPathParser.java:928)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.EqualityExpr(XPathParser.java:868)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.AndExpr(XPathParser.java:832)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.OrExpr(XPathParser.java:805)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.Expr(XPathParser.java:788)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.initXPath(XPathParser.java:127)
at com.sun.org.apache.xpath.internal.XPath.<init>(XPath.java:176)
at com.sun.org.apache.xpath.internal.XPath.<init>(XPath.java:264)
at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.eval(XPathImpl.java:193)
at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:275)
... 7 more

しかし面白いことに、ブースの場合、ノードは[#text]ノードであり、なぜそれが起こるのか混乱しました。

4

1 に答える 1

0

必要に応じてノードの位置を返す関数を作成しました:

test.xml

    <html>
           <div id='teste'>Teste</div>
           <div id='poutine'>poutine</div>
           <div id='ola'>Ola tudo ebm!</div>
   </html>

XMLManager クラス:

           public final class XMLManager {


            public static Integer getPositionByNode(Node node, File filteForLookUp){

                Integer position = null;    

                try {

                    Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(filteForLookUp);

                    NodeList ndList = doc.getElementsByTagName("*");


                    if(ndList != null){

                        for(int i=0;i<ndList.getLength();i++){

                            if(ndList.item(i).isEqualNode(node)){
                                position = i;
                                System.out.println("Dans la condition");
                            }


                        }


                    }

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (SAXException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ParserConfigurationException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


                return position;

            }

        }

私のメイン:

            public class MyMain {

            /**
             * @param args
             */
            public static void main(String[] args) {


                 Document doc = null;
                 File file = new File("D:\\Loic_Workspace\\Test2\\res\\test.xml");
                try {
                    doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
                    System.out.println(doc.getElementsByTagName("*").item(2).getTextContent());
                    System.out.println(XMLManager.getPositionByNode(doc.getElementsByTagName("*").item(2), file));
                } catch (SAXException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ParserConfigurationException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }



            }

        }

コンソールでの出力:

プーティン ダンス ラ コンディション 2

ちなみに、[#text] を取得するのもおかしくないですが、 getTextContent() メソッドで値を取得することはできません。


それが役立つことを願っています;)

于 2012-12-06T00:33:14.913 に答える