A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 大山哥哥 于 2017-5-31 18:52 编辑

当在XML文件中引入了外部约束,使用了命名空间的时候,如果要使用DOM4J+XPATH解析XML文件可能会出现解析不到节点内容的问题,下面给出一种解决办法。
【步骤一】准备XML文件和约束文件
XML文件(aaa.xml,该文件放置在src目录下):
[XML] 纯文本查看 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<classes
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="xiaofan"
        xsi:schemaLocation="xiaofan members.xsd"
>
        <member no="1">
                <name>名称1</name>
                <birthday>1992-11-09</birthday>
                <hobby>女</hobby>
        </member>
        <member no="2">
                <name>名称2</name>
                <birthday>1999-03-03</birthday>
                <hobby>男</hobby>
        </member>
</classes>


约束文件(members.xsd):
[XML] 纯文本查看 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<schema 
        xmlns="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="xiaofan" 
        elementFormDefault="qualified">
        
        <element name="classes">
                <complexType>
                        <sequence minOccurs="1" maxOccurs="unbounded">
                                <element name="member">
                                        <complexType>
                                                <all>
                                                        <element name="name" type="string"></element>
                                                        <element name="birthday" type="date"></element>
                                                        <element name="hobby" type="string"></element>
                                                </all>
                                                <attribute name="no" type="int"></attribute>
                                        </complexType>
                                </element>
                        </sequence>
                </complexType>
        </element>
        
</schema>

在aaa.xml文件中,自定义的命名空间是“xiaofan”
【步骤二】使用DMO4J+XPATH完成解析
[Java] 纯文本查看 复制代码
@Test
        public void oldCalXml(){
                try {
                        //使用DOM4J SAXReader进行解析
                        SAXReader saxReader = new SAXReader();
                        //拿到document对象
                        Document document = saxReader.read("src/aaa.xml");
                        //准备一个map集合,用于存放给xpath使用的命名空间键值对
                        Map<String, String> map = new HashMap<String, String>();
                        //将XML文件中我们自定义的命名空间xiaofan交给一个key
                        map.put("nsKey", "xiaofan");//第一个参数 命名空间的名字   第二个参数 是我们自定义的namespace
                        //使用DocumentFactory装载刚刚设置的map配置
                        saxReader.getDocumentFactory().setXPathNamespaceURIs(map);
                        
                        //下面,就可以使用XML对想要读取内容的节点进行解析了
                        List<Element> nodes = document.selectNodes("//nsKey:name");
                        for (Element element : nodes) {
                                System.out.println(element.getText());
                        }
                } catch (DocumentException e) {
                        e.printStackTrace();
                }
        }


【打印如下】
         

demo.jpg (96.31 KB, 下载次数: 11)

demo.jpg

2 个回复

倒序浏览
顶顶顶~
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马