2011-05-02 76 views
1

HI there, 我有一个动态生成的xml,我想从中提取信息。我使用的是Xpath表达式,但发现我的xpath表达式工作不正常,它不能正常工作“T选择什么.....这是我的Java函数执行该XPath表达式:Xpath表达式不会选择任何东西

public void TraverseClass(NavigationTree parent,String name) 
    { 
     xPath = XPathFactory.newInstance().newXPath(); 
      XPathExpression expr; 

      try { 
       expr = xPath.compile("Class[@name=\""+name+"\"]/Class"); 
       Object result = expr.evaluate(document, XPathConstants.NODESET); 
        NodeList nodes = (NodeList) result; 

        JOptionPane.showMessageDialog(null,nodes.getLength()); 
        for(int i=0;i<=nodes.getLength()-1;i++) 
        { 
         Node first=nodes.item(i); 
         Element node=(Element)first; 
         JOptionPane.showMessageDialog(null,"Found Classes inside "+name+" " +node.getAttribute("name")); 
         parent.foundClass(node.getAttribute("name")); 
        //Interfaces[i]=node.getAttribute("name"); 

        } 
        expr = xPath.compile("Class[@name=\""+name+"\"]/Interfaces"); 
        result = expr.evaluate(document, XPathConstants.NODESET); 
        nodes = (NodeList) result; 

         JOptionPane.showMessageDialog(null,nodes.getLength()); 
         for(int i=0;i<=nodes.getLength()-1;i++) 
         { 
          Node first=nodes.item(i); 
          Element node=(Element)first; 
          JOptionPane.showMessageDialog(null,"Found Interfaces inside "+name+" "+node.getAttribute("name")); 
          parent.foundInterface(node.getAttribute("name")); 
         //Interfaces[i]=node.getAttribute("name"); 

         } 
         expr = xPath.compile("Class[@name=\""+name+"\"]/Method"); 
         result = expr.evaluate(document, XPathConstants.NODESET); 
         nodes = (NodeList) result; 

          JOptionPane.showMessageDialog(null,nodes.getLength()); 
          for(int i=0;i<=nodes.getLength()-1;i++) 
          { 
           Node first=nodes.item(i); 
           Element node=(Element)first; 
           JOptionPane.showMessageDialog(null,"Found Methods inside "+name+" "+node.getAttribute("name")); 
           parent.foundMethod(node.getAttribute("name")); 
          //Interfaces[i]=node.getAttribute("name"); 

          } 


      } catch (XPathExpressionException e) { 
       JOptionPane.showMessageDialog(null,"error: "+e.toString()); 
       e.printStackTrace(); 
      } 
      JOptionPane.showMessageDialog(null,"going one step back in Class "+name); 
      parent.goOneStepBack(); 
    } 

现在我试图解析XML文件

<?xml version="1.0"?> 
<program> 
<Interface modifier="public" name="interface1"> 
    <ParentInterface> i1</ParentInterface> 
    <ParentInterface> i2</ParentInterface> 
    <ParentInterface> i3</ParentInterface> 
    <Field modifier="" type="int" name="a,b,c"> 
    </Field> 
    <Interface modifier="public" name="one"> 
    <ParentInterface> two</ParentInterface> 
    </Interface> 
    <Class modifier="public" name="three"> 
    <Parent>four</Parent> 
    </Class> 
    <Method modifier="" type="void" name="foo1"> 
    <FormalParameter > 
    </FormalParameter> 
    </Method> 
</Interface> 
<Class modifier="" name="FrontPAge"> 
    <Parent>JFrame</Parent> 
    <Field modifier="public" type="int" name="a,b,c"> 
    </Field> 
    <Field modifier="" type="int" name="arr[]"> 
    </Field> 
    <Field modifier="" type="int" name="arr2[]"> 
    </Field> 
    <Field modifier="" type="int" name="num[]"> 
    </Field> 
    <Field modifier="" type="FrontPAge" name="fp"> 
    </Field> 
    <Constructor modifier="public" name="FRontPage"> 
    <FormalParameter > 
    </FormalParameter> 
    <Statement> <![CDATA[System.out.println("It is a constructor")]]></Statement> 
    </Constructor> 
    <Method modifier="publicstatic" type="void" name="main"> 
    <FormalParameter modifier="" type="String[]" var_name="args" > 
    </FormalParameter> 
    <Field modifier="" type="int" name="x,y,z"> 
    </Field> 
    <Field modifier="" type="int" name="sum[]"> 
    </Field> 
    <For> 
    <Itr_Var type="int">x</Itr_Var> 
    <Collection><![CDATA[num]]></Collection> 
    <Statement> <![CDATA[sum+=x]]></Statement> 
    </For> 
    <Interface modifier="public" name="qqq"> 
    <ParentInterface> www</ParentInterface> 
    </Interface> 
    <Statement> <![CDATA[System.out.println("Runnable is gonna start")]]></Statement> 
    <Class name="Runnable"> 
    <Method modifier="public" type="void" name="run"> 
    <FormalParameter > 
    </FormalParameter> 
    <Statement> <![CDATA[System.out.println("Hello")]]></Statement> 
    </Method> 
    </Class> 
    <Statement> <![CDATA[EventQueue.invokeLater(newRunnable(){publicvoidrun() {System.out.println("Hello");}})]]></Statement> 
    <Statement> <![CDATA[System.out.println("Runnable Ends Here")]]></Statement> 
    <Statement> <![CDATA[c=b+d]]></Statement> 
    <Statement> <![CDATA[a=b+c]]></Statement> 
    </Method> 
    <Class modifier="" name="nested"> 
    </Class> 
    <Interface modifier="public" name="xxx"> 
    <ParentInterface> yyy</ParentInterface> 
    </Interface> 
</Class> 
</program> 

信息:JAVA的名称参数函数包含一个最高级别的名称l类,也就是根元素的后代,它可能还包含其他类/接口/方法...

问题:我的问题是我使用的表达式Class[@name=<ClassName>]/Class应该从xml中选择所有类,排除除select带有名称的类,然后选择该类的所有子类......与接口和方法相同...但它根本不起作用!!!! ....表达式都不匹配任何....

得多,因为从源代码动态生成xml和除了根元素太经受改变

+0

您忘了告诉我们您要选择提供的XML文档的哪些节点?请这样做,否则您的问题不是真正的问题,可能会被关闭/删除。不要说人们猜测,你收到的答案不是及时或准确的。 – 2011-05-02 13:04:49

回答

3

该表达式选择所有嵌套类(只有一个示例文档中:类“头版”有着嵌套类:

//Class/Class 

或name属性

//Class[@name="FrontPAge"]/Class 

你表达应该工作,如果你评估根节点而不是文件(8号线)。如果要对文档评估,第一个元素是<program>,你不得不说

program/Class[@name=\"" + name + "\"]/Class 

关的记录:我以前this online xpath evaluator验证表达式。只需将示例文档复制到文本字段并使用XPath表达式进行播放

2

我薄从而内容的XML的我不能依靠绝对路径K优可能需要用program启动XPath表达式,因为它是根元素

如:

expr = xPath.compile("program/Class[@name=\""+name+"\"]/Interfaces") 

我没有测试过这一点我自己,但它是值得一试:)

+0

'* /'也适用于根元素。这是我们通常做xpath的方式。 – 2011-05-02 07:46:16

+0

我试过了,但它不起作用... :( – Sudh 2011-05-02 07:47:30

+0

我不明白,但是当我改变我的表情到 expr = xPath.compile(“program // Class [@ name = \”“ +名称+“\”] /接口“); 它至少为这个XML工作....现在当我解释它时,它会选择程序的所有后代并选择具有给定名称的类元素,然后选择该类的所有接口.....但是我怀疑当有两个高级类时,它会失败包含具有相同名称的其他建议的接口,以获得更好的XPath表达式? – Sudh 2011-05-02 07:59:33