Sử dụng Dom4j để lấy dữ liệu child element XML trong java

Em có 1 file XML như này:

<group>
	<group0>John,US,50.6</group0>
	<group1>John,US,50.6</group1>
	<group2>Marry,Canada,65.7</group2>
	<group3>Emily,France,43.9</group3>
	....
	<groupN>Jenny,Italia,77.5</groupN>
</group>

Giờ em xài for loop sau đó sử dụng dom4j để lấy giữ liệu của child element sau đó sử dụng split(",") để tách dữ liệu ra rồi gán vào các biến sau:

Element groupElement = node.element("group"); // node là tham số của public void init(Element node)
String[] name, country; // [0] và [1]
float[] salary; // [2]
String[] childElement = new String[N], splitElement = new String[3]; // N là cái số ở child element <groupN>
for(int i = 0; i < N; i++) {
	childElement[i] = groupElement.elementTextTrim("group"+i);
	splitElement = childElement[i].split(",");
	name[i] = splitElement[0];
	country[i] = splitElement[1];
	salary[i] = Float.parseFloat(splitElement[2]);
}

Nhưng vấn đề là:

  1. Mỗi khi em thêm một child element mới vào trong , tức N+1 thì em sẽ phải sửa lại đoạn for loop sau đó biên dịch lại. Do đóm em muốn hỏi có cách nào để đếm được xem trong có tất cả bao nhiêu cái child element không để có thể thay cho cái N ở for loop, thuận tiện sau này có thêm child element mới đỡ phải chỉnh lại code ạ?
  2. Đoạn for loop em làm đúng chưa ạ? Mục đích chính là khi em nhập 2 chẳng hạn thì nó sẽ hiển thị name, country, salary ở <group2> ạ.

Em xin cảm ơn!

  1. Trước hết, cấu trúc XML không ổn rồi.
    Sao bạn phải thêm số vào để phức tạp hóa dữ liệu vậy?
    Chỉ cần:
<groups>
    <group>Name XX, Country YY, Salary ZZ</group>
    <group>Name XX, Country YY, Salary ZZ</group>
    <group>Name XX, Country YY, Salary ZZ</group>
    <group>Name XX, Country YY, Salary ZZ</group>
    <group>Name XX, Country YY, Salary ZZ</group>
    ...
    <group>Name XX, Country YY, Salary ZZ</group>
</groups>

Cách hay hơn, dùng thuộc tính XML để không bị xung đột khi cắt chuỗi.

<groups>
    <group name="Name XX" country="Country YY" salary="Salary ZZ"></group>
    <group name="Name XX" country="Country YY" salary="Salary ZZ"></group>
    <group name="Name XX" country="Country YY" salary="Salary ZZ"></group>
    <group name="Name XX" country="Country YY" salary="Salary ZZ"></group>
    ...
    <group name="Name XX" country="Country YY" salary="Salary ZZ"></group>
</groups>

Hoặc dùng các Node con cho từng giá trị.
2. Đoạn mã:
- Chưa khởi tạo mảng cho name, country, salary mà đã sử dụng chúng trong vòng lặp. NullPointerException.
- N lấy ở đâu ra? Có thể lấy số lượng Node con bằng cách gọi size().

3 Likes

Ban đầu em thêm số vào sau các child element để làm ID cho nó, giờ em đã thử loại bỏ số ở đó đi, đưa về dạng:

<groups>
    <group>Name XX, Country YY, Salary ZZ</group>
    <group>Name XX, Country YY, Salary ZZ</group>
    <group>Name XX, Country YY, Salary ZZ</group>
    <group>Name XX, Country YY, Salary ZZ</group>
    <group>Name XX, Country YY, Salary ZZ</group>
    ...
    <group>Name XX, Country YY, Salary ZZ</group>
</groups>

Nhưng vẫn bị NullPointerException là sao ạ?
Còn về cái link kia thì cái <group> không phải là root element ạ. Toàn bộ file nó có dạng:

<root>
	...
	<group>
		<group0>John,US,50.6</group0>
		<group1>John,US,50.6</group1>
		<group2>Marry,Canada,65.7</group2>
		<group3>Emily,France,43.9</group3>
		....
		<groupN>Jenny,Italia,77.5</groupN>
	</group>
	...
</root>

Cơ ạ.

Trong Element class có method elementIterator() đó cậu. Cậu chỉ cần tìm element “groups”, sau đó dùng iterator để duyệt.
Code của nó nên trông như ở link này:

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?