如何使用dom4j删除xml命名空间声明?

时间:2014-04-01 08:52:08

标签: xpath dom4j

我使用来解析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> 

当我运行我的测试程序时,我得到了一个N​​ullPointerException堆栈。但是,如果我删除了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());
}

所以我的问题是:有人可以就如何解决它给我一些建议吗?

1 个答案:

答案 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;
}