我需要解析下面的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的arraylist中,如下面显示的其他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,我需要将它存储在类中。你能否帮我解决这个问题。
答案 0 :(得分:0)
您可以从以下示例中获得建议。
main.xml中
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SAXParserExample" >
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:text="@string/hello_world"
android:textColor="#CC0033"
android:textSize="16sp" />
<ListView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="@id/text" />
</RelativeLayout>
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dp"
android:textSize="16sp" />
Main.java
public class SAXParserExample extends Activity {
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_saxparser_example);
listView = (ListView) findViewById(R.id.list);
List<Employee> employees = null;
try {
XMLPullParserHandler parser = new XMLPullParserHandler();
employees = parser.parse(getAssets().open("employees.xml"));
ArrayAdapter<Employee> adapter =
new ArrayAdapter<Employee>(this,R.layout.list_item, employees);
listView.setAdapter(adapter);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.saxparser_example, menu);
return true;
}
}
资产文件夹中的写入Employees.xml
<?xml version="1.0" encoding="UTF-8"?>
<employees>
<employee>
<id>2163</id>
<name>Kumar</name>
<department>Development</department>
<type>Permanent</type>
<email>kumar@tot.com</email>
</employee>
<employee>
<id>6752</id>
<name>Siva</name>
<department>DB</department>
<type>Contract</type>
<email>siva@tot.com</email>
</employee>
<employee>
<id>6763</id>
<name>Timmy</name>
<department>Testing</department>
<type>Permanent</type>
<email>timmy@tot.com</email>
</employee>
</employees>
Employee.java中的
public class Employee {
private String name;
private int id;
private String department;
private String type;
private String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return id + ": " + name + "\n" + department + "-" + type
+ "\n" + email;
}
}
在XMLPullParserHandler.java等处理程序中
public class XMLPullParserHandler {
List<Employee> employees;
private Employee employee;
private String text;
public XMLPullParserHandler() {
employees = new ArrayList<Employee>();
}
public List<Employee> getEmployees() {
return employees;
}
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("employee")) {
// create a new instance of employee
employee = new Employee();
}
break;
case XmlPullParser.TEXT:
text = parser.getText();
break;
case XmlPullParser.END_TAG:
if (tagname.equalsIgnoreCase("employee")) {
// add employee object to list
employees.add(employee);
} else if (tagname.equalsIgnoreCase("name")) {
employee.setName(text);
} else if (tagname.equalsIgnoreCase("id")) {
employee.setId(Integer.parseInt(text));
} else if (tagname.equalsIgnoreCase("department")) {
employee.setDepartment(text);
} else if (tagname.equalsIgnoreCase("email")) {
employee.setEmail(text);
} else if (tagname.equalsIgnoreCase("type")) {
employee.setType(text);
}
break;
default:
break;
}
eventType = parser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return employees;
}
}