我使用dom4j和xpath来解析xml文件,我遇到了一个问题:如果有 xmlns 声明,那么xPath将不会返回任何内容,但是,如果删除了名称空间声明,那么xPath工作正常,并将重新计算期望值。
这是我的java测试文件:
public class XPathTest {
public static void main(String[] args) {
testXPath();
}
public static void testXPath(){
Document doc=getDocument("file/info.xml");
Element root=doc.getRootElement();
/*boolean removeFlag=root.remove(root.getNamespace());
System.out.println("removeFlag:\t"+removeFlag);*/
Node node=root.selectSingleNode("list[@id='002']/name");
System.out.println(node.getText());
}
public static Document getDocument(String file){
Document document=null;
SAXReader saxReader=null;
try {
saxReader=new SAXReader();
document= saxReader.read(new File(file));
} catch (DocumentException e) {
e.printStackTrace();
}
return document;
}
}
这是我的xml文件:
<?xml version="1.0" encoding="utf-8"?>
<info xmlns="http://fit42.sys42.vwg/emx">
<intro>信息</intro>
<list id='001'>
<head>auto_userone</head>
<name>Jordy</name>
<number>12345678</number>
<age>20</age>
<sex>Man</sex>
<hobby>看电影</hobby>
</list>
<list id='002'>
<head>auto_usertwo</head>
<name>tester</name>
<number>34443678</number>
<age>18</age>
<sex>Man</sex>
<hobby>玩游戏</hobby>
</list>
<taichung id='003'>
<mayor>Jason Hu</mayor>
</taichung>
</info>
当我运行我的测试程序时,我得到了一个NullPointerException堆栈。但是,如果我删除了xml的命名空间声明并使其如下所示,那么一切正常:
<?xml version="1.0" encoding="utf-8"?>
<info>
<intro>信息</intro>
<list id='001'>
<head>auto_userone</head>
<name>Jordy</name>
<number>12345678</number>
<age>20</age>
<sex>Man</sex>
<hobby>看电影</hobby>
</list>
<list id='002'>
<head>auto_usertwo</head>
<name>tester</name>
<number>34443678</number>
<age>18</age>
<sex>Man</sex>
<hobby>玩游戏</hobby>
</list>
<taichung id='003'>
<mayor>Jason Hu</mayor>
</taichung>
</info>
但由于xml文件是从其他公司获取而我无法修改它的结构,所以我试图在我的progaram中删除命名空间声明,我修改了 testXPath 方法如下,remove动作返回true,我仍然可以在rootElement中看到xml声明,所以程序仍然生成NullPointerException,我不知道为什么:
public static void testXPath(){
Document doc=getDocument("file/info.xml");
Element root=doc.getRootElement();
boolean removeFlag=root.remove(root.getNamespace());
System.out.println("removeFlag:\t"+removeFlag);
Node node=root.selectSingleNode("list[@id='002']/name");
System.out.println(node.getText());
}
所以我的问题是:有人可以就如何解决它给我一些建议吗?
答案 0 :(得分:0)
HY,
您的问题出在xPath中,如果元素名称或属性的名称为caratere utf8,或者在您的xml中,您已经设置了NameSpace,则必须使用xPath中的函数。
这是代码工作:
public static void main(String[] args) {
testXPath();
}
public static void testXPath() {
Document doc = getDocument("C:\\test\\test.xml");
if (doc != null) {
Element root = doc.getRootElement();
Element element = (Element) root.selectSingleNode("./*[name()='list'][@id='002']/*[name()='name']");
if (element != null) {
System.out.println(element.asXML());
}
else {
System.out.println("element not found");
}
}
else {
System.out.println("File XML not found/ Error parse XML file");
}
}
public static Document getDocument(String pathname) {
Document document = null;
SAXReader saxReader = null;
try {
saxReader = new SAXReader();
document = saxReader.read(new File(pathname));
}
catch (DocumentException e) {
e.printStackTrace();
}
return document;
}