xml文件:从网络获取,或存在本地(assets目录下);
<?xml version="1.0" encoding="UTF-8"?>
<Persons>
<person id="1">
<name>张三</name>
<sex>男</sex>
<age>25</age>
<path>http://192.168.5.10:8080/FileServer/chengjisihan.jpg</path>
</person>
<person id="2">
<name>李斯</name>
<sex>男</sex>
<age>78</age>
<path>http://192.168.5.10:8080/FileServer/laozi.jpg</path>
</person>
<person id="3">
<name>王五</name>
<sex>男</sex>
<age>22</age>
<path>http://192.168.5.10:8080/FileServer/lilongji.jpg</path>
</person>
</Persons>
三种实现方法:pull、dom、sax
public class XmlTestActivity extends BaseAct<ActXmlTestBinding> {
private ActXmlTestBinding testBinding;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
testBinding = setContent(R.layout.act_xml_test);
testBinding.btnPull.setOnClickListener(v -> {
try {
List<Person> pullPerson = parseXmlByPull();
testBinding.tvResult.setText(pullPerson.toString());
} catch (Exception e) {
e.printStackTrace();
}
});
testBinding.btnDom.setOnClickListener(v -> {
try {
testBinding.tvResult1.setText(parseXmlByDom().toString());
} catch (Exception e) {
e.printStackTrace();
}
});
testBinding.btnSax.setOnClickListener(v -> {
try {
testBinding.tvResult2.setText(parseXmlBySax().toString());
} catch (Exception e) {
e.printStackTrace();
}
});
}
private List<Person> parseXmlByPull() throws Exception {
List<Person> list = null;
Person person = null;
XmlPullParser parser = Xml.newPullParser();
parser.setInput(getAssets().open("person.xml"), "utf-8");
int type = parser.getEventType();
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
case XmlPullParser.START_DOCUMENT:
list = new ArrayList<>();
break;
case XmlPullParser.START_TAG:
if ("person".equals(parser.getName())) {
person = new Person();
} else if ("name".equals(parser.getName())) {
String name = parser.nextText();
person.setName(name);
} else if ("sex".equals(parser.getName())) {
String sex = parser.nextText();
person.setSex(sex);
} else if ("age".equals(parser.getName())) {
String age = parser.nextText();
person.setAge(Integer.parseInt(age));
}
break;
case XmlPullParser.END_TAG:
if ("person".equals(parser.getName())) {
list.add(person);
}
break;
}
type = parser.next();
}
return list;
}
private List<Person> parseXmlByDom() throws Exception {
List<Person> itList = new ArrayList<>();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(getAssets().open("person.xml"));
NodeList personList = document.getElementsByTagName("person");
for (int i = 0; i < personList.getLength(); i++) {
Node node_person = personList.item(i);
NodeList childNodes = node_person.getChildNodes();
Person person = new Person();
for (int j = 0; j < childNodes.getLength(); j++) {
Node childNode = childNodes.item(j);
if ("name".equals(childNode.getNodeName())) {
String name = childNode.getTextContent();
person.setName(name);
} else if ("sex".equals(childNode.getNodeName())) {
String sex = childNode.getTextContent();
person.setSex(sex);
} else if ("age".equals(childNode.getNodeName())) {
String age = childNode.getTextContent();
person.setAge(Integer.parseInt(age));
}
}
itList.add(person);
}
return itList;
}
private List<Person> parseXmlBySax() throws Exception {
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
SaxparseHandler handler = new SaxparseHandler();
sp.parse(getAssets().open("person.xml"), handler);
return handler.getList();
}
public class SaxparseHandler extends DefaultHandler {
private List<Person> list;
private Person person;
private String tempString;
@Override
public void startDocument() throws SAXException {
list = new ArrayList<>();
super.startDocument();
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if ("person".equals(qName)) {
person = new Person();
}
super.startElement(uri, localName, qName, attributes);
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("person".equals(qName)) {
list.add(person);
}
if ("name".equals(qName)) {
person.setName(tempString);
} else if ("sex".equals(qName)) {
person.setSex(tempString);
} else if ("age".equals(qName)) {
person.setAge(Integer.parseInt(tempString));
}
super.endElement(uri, localName, qName);
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
tempString = new String(ch, start, length);
super.characters(ch, start, length);
}
public List<Person> getList() {
return list;
}
}
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<layout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn_pull"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="pull" />
<Button
android:id="@+id/btn_dom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="dom" />
<Button
android:id="@+id/btn_sax"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="sax" />
<TextView
android:id="@+id/tv_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv_result1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv_result2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</layout>
运行结果