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