我有xml如下。
<xml>
<!-- Labels -->
<labels>
<label id="lblMS">
<text language="EN" value="Morning Sync"/>
<text language="DE" value="Morgan Sync"/>
</label>
<label id="lblES">
<text language="EN" value="Evening Sync"/>
<text language="DE" value="Sync Abend"/>
</label>
<label id="lblAS">
<text language="EN" value="Afternoon Sync"/>
<text language="DE" value="Sync Afternoon"/>
</label>
</labels>
<syncgroupsettings>
<syncgroupset id = "sgMS" labelid = "lblMS" enabled = "YES" default = "OFF">
<syncgroup syncgroupname = "VISITS"/>
<syncgroup syncgroupname = "CUSTOMERS"/>
</syncgroupset>
<syncgroupset id = "sgAS" labelid = "lblAS" enabled = "YES" default = "ON">
<syncgroup syncgroupname = "SALESDOCS"/>
<syncgroup syncgroupname = "ANALYTICS"/>
</syncgroupset>
</syncgroupsettings>
</xml>
我正在解析xml的第一部分,即。标签部分。当我到达标签标签的末尾,而不是去下一个节点即。 syncgroupsettings它返回带有hashmap的数组列表。请找到如下代码。
import android.util.Xml;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class CountryXmlParser {
private static final String ns = null;
List<SyncGroupSettings> employees;
private SyncGroupSettings employee;
private String text;
public CountryXmlParser() {
employees = new ArrayList<SyncGroupSettings>();
}
public List<SyncGroupSettings> getEmployees() {
return employees;
}
/** This is the only function need to be called from outside the class */
public List<ArrayList<HashMap>> parse(Reader reader)
throws XmlPullParserException, IOException{
try{
List<ArrayList<HashMap>> list = new ArrayList<ArrayList<HashMap>>();
XmlPullParser parser = Xml.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(reader);
parser.nextTag();
return readCountries(parser);
}finally{
}
}
/** This method read each country in the xml data and add it to List */
private List<ArrayList<HashMap>> readCountries(XmlPullParser parser)
throws XmlPullParserException,IOException{
List<ArrayList<HashMap>> list = new ArrayList<ArrayList<HashMap>>();
parser.require(XmlPullParser.START_TAG, ns, "xml");
while(parser.next() != XmlPullParser.END_TAG) {
if(parser.getEventType() != XmlPullParser.START_TAG){
continue;
}
String name = parser.getName();
if(name.equals("labels")){
//readCapital(parser);
}
else if(name.equals("label"))
{
list.add(readCountry(parser));
}
else
if(name.equals("syncgroupsettings"))
{
//do nothing
}
else
if(name.equals("syncgroupset"))
{
parse(parser);
}else
{
skip(parser);
}
}
parse(parser);
return list;
}
/** This method read a country and returns its corresponding HashMap construct */
private ArrayList<HashMap> readCountry(XmlPullParser parser)
throws XmlPullParserException, IOException{
parser.require(XmlPullParser.START_TAG, ns, "label");
String labelid = parser.getAttributeValue(ns, "id");
String textlan = "";
String textval="";
ArrayList<HashMap> al=new ArrayList<HashMap>();
HashMap<String, String> hm = new HashMap<String, String>();
while(parser.next() != XmlPullParser.END_TAG){
if(parser.getEventType() != XmlPullParser.START_TAG){
continue;
}
String name = parser.getName();
if(name.equals("text")) {
// labelid = parser.getAttributeValue(ns, "id");
textlan = parser.getAttributeValue(ns,"language");
textval = parser.getAttributeValue(ns,"value");
String details = "Language : " + textlan + "\n" +
"Value : " + textval + "\n";
hm.put(labelid,details );
al.add(hm);
readCapital(parser);
}
else
{
skip(parser);
}
}
return al;
}
/** Process Capital tag in the xml data */
private void readCapital(XmlPullParser parser)
throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG, ns, "text");
parser.nextTag();
}
private void skip(XmlPullParser parser)
throws XmlPullParserException, IOException {
if (parser.getEventType() != XmlPullParser.START_TAG) {
throw new IllegalStateException();
}
int depth = 1;
while (depth != 0) {
switch (parser.next()) {
case XmlPullParser.END_TAG:
depth--;
break;
case XmlPullParser.START_TAG:
depth++;
break;
}
}
}
public List<SyncGroupSettings> parse(XmlPullParser parser) {
String id = "";
String labelid="";
String enabled = "";
String default1 = "";
String syngroupname = "";
try {
parser.require(XmlPullParser.START_TAG, ns, "syncgroupsettings");
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
String tagname = parser.getName();
switch (eventType) {
case XmlPullParser.START_TAG:
if (tagname.equalsIgnoreCase("syncgroupset")) {
// create a new instance of employee
employee = new SyncGroupSettings();
employees.add(employee);
id = parser.getAttributeValue(ns,"id");
labelid = parser.getAttributeValue(ns,"labelid");
enabled = parser.getAttributeValue(ns,"enabled");
default1 = parser.getAttributeValue(ns,"default");
employee.setId(id);
employee.setLabelId(labelid);
employee.setSynDefault(enabled);
employee.setSynEnabled(default1);
}else
if (tagname.equalsIgnoreCase("syncgroup")) {
ArrayList<SyncGroupSettings.Item> syngrp =new ArrayList<SyncGroupSettings.Item>();
syngroupname = parser.getAttributeValue(ns,"syncgroupname");
readSyncgroup(parser);
// employee.setName(text);
}
break;
case XmlPullParser.TEXT:
text = parser.getText();
break;
case XmlPullParser.END_TAG:
break;
default:
break;
}
eventType = parser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return employees;
}
/** Process Capital tag in the xml data */
private void readSyncgroup(XmlPullParser parser)
throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG, ns, "syncgroup");
parser.nextTag();
}
}
请帮我解决这个问题。
答案 0 :(得分:0)
您只检查根节点,而不是其中的节点,您需要循环查找节点是否在您的根节点内
**首先KEY_ITEM
值将为labels
,然后再次使用syncgroupsettings
来获取分支元素,同样内部循环KEY_ID将是分支名称,就像第一次一样将是label
然后syncgroupset
**
XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(URL); // getting XML
Document doc = parser.getDomElement(xml); // getting DOM element
NodeList nl = doc.getElementsByTagName(KEY_ITEM);
// looping through all item nodes <item>
for (int i = 0; i < nl.getLength(); i++) {
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
Element e = (Element) nl.item(i);
// adding each child node to HashMap key => value
map.put(KEY_ID, parser.getValue(e, KEY_ID));
list.add(map);
}
查看本教程:Parsing Xml in Android