XML和JSON解析
XML和JSON是什么?
EXtensible Markup Language,可扩展标记语言,通过标签<xxx>和相关属性来维护文档的结构,广泛用于信息传输存储。
JavaScript Object Notation,JS 对象简谱,通过键值对来存储数据。
XML解析
在res文件夹新建raw文件夹,存放strings.xml,内容如下:
<resources>
<string>demo0</string>
</resources>
Pull解析
修改MainActivity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
parseXMLWithPull();
}
private void parseXMLWithPull() {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
InputStream inputStream = getResources().openRawResource(R.raw.strings);
xmlPullParser.setInput(inputStream, "utf-8");
int eventType = xmlPullParser.getEventType();
String string = "";
while (eventType != XmlPullParser.END_DOCUMENT) {
String nodeName = xmlPullParser.getName();
switch (eventType) {
case XmlPullParser.START_TAG: {
if ("string".equals(nodeName)) {
string = xmlPullParser.nextText();
}
break;
}
case XmlPullParser.END_TAG: {
if ("resources".equals(nodeName)) {
Log.d("MainActivity", string);
}
break;
}
default:
break;
}
eventType = xmlPullParser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
SAX解析
新建类SAXHandler继承DefaultHandler,重写
- startDocument()开始解析xml时调用
- startElement()开始解析某节点时调用
- characters()获取某节点中内容时调用
- endElement()完成解析某节点时调用
- endDocument()完成解析xml时调用
public class SAXHandler extends DefaultHandler {
private String nodeName;
private StringBuilder string;
@Override
public void startDocument() throws SAXException {
string = new StringBuilder();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
nodeName = localName;
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if ("string".equals(nodeName)) {
string.append(ch, start, length);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("resources".equals(localName)) {
Log.d("SAXHandler", "string: " + string.toString().trim());
string.setLength(0);
}
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
}
修改MainActivity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
parseXMLWithSAX();
}
private void parseXMLWithSAX() {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
SAXHandler saxHandler = new SAXHandler();
xmlReader.setContentHandler(saxHandler);
xmlReader.parse(new InputSource(getResources().openRawResource(R.raw.strings)));
} catch (Exception e) {
e.printStackTrace();
}
}
}
JSON解析
Json相比xml体积更小,在网络上传输更省流量,在res下的raw文件夹新建data.json:
[
{
"id": "1",
"name": "tom"
}
]
修改MainActivity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
parseJSONWithJSONObject();
}
private void parseJSONWithJSONObject() {
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(getResources().openRawResource(R.raw.data)));
StringBuilder result = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
result.append(line);
}
JSONArray jsonArray = new JSONArray(result.toString());
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String id = jsonObject.getString("id");
String name = jsonObject.getString("name");
Log.d("MainActivity", "parseJSONWithJSONObject: " + id + " " + name);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
此外,还可以使用开源库Gson解析Json数据