我正在使用XmlPullParser
从 XML 文档中提取数据。我的 XML 文档的结构如下:
<creature id="1">
<name>CreatureName</name>
<type>CreatureType</type>
<size>CreatureSize</size>
</creature>
<creature id="2">
<name>CreatureName</name>
<type>CreatureType</type>
<size>CreatureSize</size>
</creature>
<creature id="3">
<name>CreatureName</name>
<type>CreatureType</type>
<size>CreatureSize</size>
</creature>
如果我的 XML 文件中只有一个生物,我的代码目前正在运行。
我正在寻找一种基于生物ID选择生物的方法。例如,如果ID为2,那么XMLPullParser
只能解析生物ID =“2”下的 XML 。
到目前为止,这是我的代码:
xpp.next();
String elName = "";
int encounterId = 0;
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT)
{
if(eventType == XmlPullParser.START_DOCUMENT)
{
System.out.println("START_DOCUMENT "+xpp.getName());
}
else if(eventType == XmlPullParser.START_TAG)
{
if(encounterId >= 0) {
if(xpp.getName().equalsIgnoreCase("creature")) {
System.out.println("inside while loop --- "+xpp.getName());
try {
encounterId = Integer.parseInt(xpp.getAttributeValue(0));
System.out.println("attribute value = " + encounterId);
} catch (NumberFormatException e) {
Log.e("attribute value error", e.getMessage());
}
//DETERMINE ELEMENT NAME
} else if(xpp.getName().equalsIgnoreCase("name")) {
System.out.println("inside while loop --- "+xpp.getName());
elName = "name";
} else if(xpp.getName().equalsIgnoreCase("type")) {
elName = xpp.getName();
elName = "type";
} else if(xpp.getName().equalsIgnoreCase("size")) {
elName = xpp.getName();
elname = "size";
}
} else if(eventType == XmlPullParser.END_TAG) {
System.out.println("End tag "+xpp.getName());
} else if(eventType == XmlPullParser.TEXT) {
//COLLECT DATA
if(elName.equalsIgnoreCase("name")) {
this.name = xpp.getText();
} else if(elName.equalsIgnoreCase("type")) {
this.race = xpp.getText();
} else if(elName.equalsIgnoreCase("size")) {
this.gender = xpp.getText();
}
eventType = xpp.next();
}
谢谢!
答案 0 :(得分:5)
你应该使用XPath
XmlPullParser xpp = context.getResources().getXml(R.xml.zoo_table);
XPath xpath = XPathFactory.newInstance().newXPath();
try {
String askFor2 = "//creature[@ID='2']";
NodeList creaturesNodes = (NodeList) xpath.evaluate(askFor2, xpp, XPathConstants.NODESET);
// here you have all such creatures - the list of one node in your case
答案 1 :(得分:1)
XMLPullParser将始终根据您的程序编码的当前方式读取整个文档。 。如果您只想打印ID为2的生物的详细信息,则在记录TEXT事件类型if语句内的生物的名称,种族和性别之前,应确保遇到didId == 2。
XMLPullParser无法知道文档中某处有ID 2的内容并且只是跳到它。这种XML解析方式从一开始就读取XML文档,直到您决定停止解析。
修改强> 更具体的代码
else if(eventType == XmlPullParser.TEXT) {
//COLLECT DATA
if(encounterId == 2) {
if(elName.equalsIgnoreCase("name")) {
this.name = xpp.getText();
} else if(elName.equalsIgnoreCase("type")) {
this.race = xpp.getText();
} else if(elName.equalsIgnoreCase("size")) {
this.gender = xpp.getText();
}
}
}