使用dom4j的xpath讀取XML文件
在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不能這麼做?
<?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不能這麼做?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.