如何使用 XmlPullparser 解析嵌套元素?
how to parse nested elements using XmlPullparser?
这是我的 xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<frames>
<frame>
<name>FRAME-A</name>
<coordinatesA>
<x>75</x>
<y>75</y>
</coordinatesA>
<coordinatesB>
<x>75</x>
<y>490</y>
</coordinatesB>
<coordinatesC>
<x>645</x>
<y>75</y>
</coordinatesC>
<coordinatesD>
<x>1215</x>
<y>75</y>
</coordinatesD>
<coordinatesE>
<x>0</x>
<y>0</y>
</coordinatesE>
<image>@drawable/frameguideone</image>
</frame>
如何解析坐标A B C D E标签内的x和y标签?我不知道该怎么做。谁能帮我解决这个问题?我在 google 中寻找它,但没有得到我的解决方案。
这是我的 java 解析:
public class XMLPullParserHandler {
List<Employee> frames;
private Employee frame;
private String text;
public XMLPullParserHandler() {
frames = new ArrayList<Employee>();
}
public List<Employee> getEmployees() {
return frames;
}
public List<Employee> parse(InputStream is) {
XmlPullParserFactory factory = null;
XmlPullParser parser = null;
try {
factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
parser = factory.newPullParser();
parser.setInput(is, null);
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
String tagname = parser.getName();
switch (eventType) {
case XmlPullParser.START_TAG:
if (tagname.equalsIgnoreCase("frame")) {
// create a new instance of employee
frame = new Employee();
}
break;
case XmlPullParser.TEXT:
text = parser.getText();
break;
case XmlPullParser.END_TAG:
if (tagname.equalsIgnoreCase("frame")) {
// add employee object to list
frames.add(frame);
} else if (tagname.equalsIgnoreCase("name")) {
frame.setName(text);
} else if (tagname.equalsIgnoreCase("coordinates")) {
frame.setCoordinates(Integer.parseInt(text));
} else if (tagname.equalsIgnoreCase("image")) {
frame.setImage(text);
}else if(tagname.equalsIgnoreCase("x")){
frame.setX(Integer.parseInt(text));
}else if(tagname.equalsIgnoreCase("y")){
frame.setY(Integer.parseInt(text));
}
break;
default:
break;
}
eventType = parser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return frames;
}
}
读取坐标起始标签时,创建一个新的坐标对象。在读取 x 和 y 时,设置坐标上的值。当您读取结束坐标标签时,在框架上设置坐标。
您的代码有两个问题。
首先,这行不通:
if (tagname.equalsIgnoreCase("coordinates")) {
frame.setCoordinates(Integer.parseInt(text));
}
您必须与 xml 标签同名或使用 tagname.contains("coordinates").
其次,x 和 y 将始终等于 0,因为您正在用新值擦除先前的值。所以你的 Employee 对象应该包含一个 Coordinates 列表,每次你遇到 coordinate 标签,你应该创建一个新的 Coordinate 对象,设置 x 和 y 并将它添加到列表中。
这样的事情应该有效:
case XmlPullParser.START_TAG:
if (tagname.equalsIgnoreCase("frame")) {
frame = new Employee();
}
else if (tagname.contains("coordinates")) {
frame.addCoordinate(new Coordinate());
}
break;
case XmlPullParser.END_TAG:
if (tagname.equalsIgnoreCase("x")) {
// get the coordinate object created in the START_TAG case
frame.getLastCoordinates().setX(Integer.parseInt(text));
}
else if (tagname.equalsIgnoreCase("y")) {
frame.getLastCoordinates().setY(Integer.parseInt(text));
}
希望对您有所帮助!
这是我的 xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<frames>
<frame>
<name>FRAME-A</name>
<coordinatesA>
<x>75</x>
<y>75</y>
</coordinatesA>
<coordinatesB>
<x>75</x>
<y>490</y>
</coordinatesB>
<coordinatesC>
<x>645</x>
<y>75</y>
</coordinatesC>
<coordinatesD>
<x>1215</x>
<y>75</y>
</coordinatesD>
<coordinatesE>
<x>0</x>
<y>0</y>
</coordinatesE>
<image>@drawable/frameguideone</image>
</frame>
如何解析坐标A B C D E标签内的x和y标签?我不知道该怎么做。谁能帮我解决这个问题?我在 google 中寻找它,但没有得到我的解决方案。
这是我的 java 解析:
public class XMLPullParserHandler {
List<Employee> frames;
private Employee frame;
private String text;
public XMLPullParserHandler() {
frames = new ArrayList<Employee>();
}
public List<Employee> getEmployees() {
return frames;
}
public List<Employee> parse(InputStream is) {
XmlPullParserFactory factory = null;
XmlPullParser parser = null;
try {
factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
parser = factory.newPullParser();
parser.setInput(is, null);
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
String tagname = parser.getName();
switch (eventType) {
case XmlPullParser.START_TAG:
if (tagname.equalsIgnoreCase("frame")) {
// create a new instance of employee
frame = new Employee();
}
break;
case XmlPullParser.TEXT:
text = parser.getText();
break;
case XmlPullParser.END_TAG:
if (tagname.equalsIgnoreCase("frame")) {
// add employee object to list
frames.add(frame);
} else if (tagname.equalsIgnoreCase("name")) {
frame.setName(text);
} else if (tagname.equalsIgnoreCase("coordinates")) {
frame.setCoordinates(Integer.parseInt(text));
} else if (tagname.equalsIgnoreCase("image")) {
frame.setImage(text);
}else if(tagname.equalsIgnoreCase("x")){
frame.setX(Integer.parseInt(text));
}else if(tagname.equalsIgnoreCase("y")){
frame.setY(Integer.parseInt(text));
}
break;
default:
break;
}
eventType = parser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return frames;
}
}
读取坐标起始标签时,创建一个新的坐标对象。在读取 x 和 y 时,设置坐标上的值。当您读取结束坐标标签时,在框架上设置坐标。
您的代码有两个问题。
首先,这行不通:
if (tagname.equalsIgnoreCase("coordinates")) {
frame.setCoordinates(Integer.parseInt(text));
}
您必须与 xml 标签同名或使用 tagname.contains("coordinates").
其次,x 和 y 将始终等于 0,因为您正在用新值擦除先前的值。所以你的 Employee 对象应该包含一个 Coordinates 列表,每次你遇到 coordinate 标签,你应该创建一个新的 Coordinate 对象,设置 x 和 y 并将它添加到列表中。 这样的事情应该有效:
case XmlPullParser.START_TAG:
if (tagname.equalsIgnoreCase("frame")) {
frame = new Employee();
}
else if (tagname.contains("coordinates")) {
frame.addCoordinate(new Coordinate());
}
break;
case XmlPullParser.END_TAG:
if (tagname.equalsIgnoreCase("x")) {
// get the coordinate object created in the START_TAG case
frame.getLastCoordinates().setX(Integer.parseInt(text));
}
else if (tagname.equalsIgnoreCase("y")) {
frame.getLastCoordinates().setY(Integer.parseInt(text));
}
希望对您有所帮助!