【发布时间】:2015-09-24 05:11:33
【问题描述】:
我有一个要求,我需要解析下面的 xml 并将其存储在类中。
<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>
到目前为止,我所做的是,我曾经获取节点值并将其简单地添加到 hashmap 的数组列表中,如下所示其他 xml。
public class XmlParser {
private static final String ns = null;
/** This is the only function need to be called from outside the class */
public static 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 readLabels(parser);
}finally{
}
}
/** This method read each country in the xml data and add it to List */
private static List<ArrayList<HashMap>> readLabels(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")){
//do nothing
}
else if(name.equals("label"))
{
list.add(readLabel(parser));
}
else
{
skip(parser);
}
}
return list;
}
/** This method read a country and returns its corresponding HashMap construct */
private static ArrayList<HashMap> readLabel(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")) {
textlan = parser.getAttributeValue(ns,"language");
textval = parser.getAttributeValue(ns,"value");
String details = "language : " + textlan + "value : " + textval;
hm.put(labelid,details );
al.add(hm);
readText(parser);
}
else
{
skip(parser);
}
}
return al;
}
/** Process Capital tag in the xml data */
private static void readText(XmlPullParser parser)
throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG, ns, "text");
parser.nextTag();
}
private static 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;
}
}
}
}
但是对于这个特定的 xml,我需要将它存储在类中。你能帮我解决这方面的问题吗?
【问题讨论】: