使用dom4j的xpath读取XML文件

本文介绍如何使用Dom4j库解析一个简单的XML文件,包括获取元素、属性及子元素的方法,并指出在使用XPath表达式读取子节点时存在的问题。
在java中,使用dom4j读一个XML文件,该文件的格式很简单,如下:
 <?xml version="1.0" ?>
<CityDetails>
 <CityDetail>
  <CityCode>BJS</CityCode>
  <City>1</City>
  <CityName>北京</CityName>
  <CityEName>Beijing</CityEName>
  <Country>1</Country>
  <Province>1</Province>
  <Airport>NAY,PEK</Airport>
  </CityDetail>
 <CityDetail>
  <CityCode>SHA</CityCode>
  <City>2</City>
  <CityName>上海</CityName>
  <CityEName>Shanghai</CityEName>
  <Country>1</Country>
  <Province>2</Province>
  <Airport>PVG,SHA</Airport>
  </CityDetail>
 <CityDetail>
  <CityCode>TSN</CityCode>
  <City>3</City>
  <CityName>天津</CityName>
  <CityEName>Tianjin</CityEName>
  <Country>1</Country>
  <Province>3</Province>
  <Airport>TSN</Airport>
  </CityDetail>
<CityDetails>

读这个文件方法如下:

    public static void main(String args[]) throws Exception {

        SAXReader reader = new SAXReader();

        String filePath = "src/resources/国内城市.xml";

        File file = new File(filePath);

        ArrayList<String> cityList = new ArrayList<String>();


        if (file.exists()) {
            Document document = reader.read(file);// 读取XML文件
            Element root = document.getRootElement();// 得到根节点

            String xPathString = "//CityDetails/CityDetail";
            List list = root.selectNodes(xPathString);
            Element cityDetail, city, cityName, province, country;
            Node cityNode, cityNameNode;
            int i = 0;

            for (Object obj : list) {

                cityDetail = (Element) obj;

                //方法一,使用    elementText可以显示出子元素的text。
                System.out.println(cityDetail.elementText("City")+":"+cityDetail.elementText("CityName"));

                //方法二,继续使用xpath,则只能显示第一个节点的元素,循环下面的都没变化,还是第一个节点。                
                xPathString = "//CityDetail/City";
                cityNode = cityDetail.selectSingleNode(xPathString);

                city = (Element) cityNode;
                System.out.println(city.asXML());
                // System.out.println(city.getText());

                xPathString = "//CityDetail/CityName";
                cityNameNode = cityDetail.selectSingleNode(xPathString);
                cityName = (Element) cityNameNode;
                System.out.println(cityName.asXML());
                // System.out.println(cityName.getText());

                i++;
                if (i > 2)
                    break;

            }

        } else {
            System.out.println("file not exists");

        }


    }
    
    显示的结果是这样:
    
1:北京
<City>1</City>
<CityName>北京</CityName>
2:上海
<City>1</City>
<CityName>北京</CityName>
3:天津
<City>1</City>
<CityName>北京</CityName>

问题在于,在xpath读取到一个节点后,继续使用xpath读取子节点时,出现问题。所有循环读取的结果都是第一个子节点的值。如本测试中的“<City>1</City><CityName>北京/CityName>”。

难道xpath不能这么做?




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值