xml格式
前言:
网络数据传输时,最常用的格式有两种:XML和JSON,下面我们就研究如何使用Pull解析和Sex解析来实现对xml格式文件数据的解析。
实例流程:
1.创建服务器:Apache服务器(用于模拟解析网络中的数据)
2.在apache安装目录下的htdocs目录下创建xml格式的文件(用于解析)
3.使用Pull方法解析XML数据
4.使用SAX方法解析XML数据
实例完整步骤:
1.创建服务器(可以借鉴这篇博客创建自己的服务器,我就是看这篇的博客)
https://www.cnblogs.com/yerenyuan/p/5460336.html
2.在Apache安装目录下的htdocs目录下创建xml格式的文件(用于解析),我创建了get_data.xml文件,内容为:
<APPs>
<app>
<id>1</id>
<name>Google Maps</name>
<virsion>1.0</virsion>
</app>
<app>
<id>2</id>
<name>Chrome</name>
<version>2.1</version>
</app>
<app>
<id>3</id>
<name>google play</name>
<version>2.3</version>
</app>
</apps>
登录http://127.0.0.1/get_data.xml,可以看看是否创建成功,如下图:
好了,这就是我们需要的准备工作,下面我们来实现使用Pull解析xml格式的数据。
3.使用Pull方法解析XML数据,代码如下:
首先是布局文件,添加一个button控件就可以了:
<?xml version="1.0" encoding="utf-8"?>
<Linearlayout 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"
android:orientation="vertical"
tools:context="com.example.networktest.MainActivity">
<Button
android:id="@+id/send_request_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="send request" />
</LinearLayout>
接着我们来修改java代码部分:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "MainActivity";
private Button requestBtn;
@Override
protected void onCreate(Bundle savedinstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindID();
}
private void bindID() {
requestBtn = findViewById(R.id.send_request_btn);
requestBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.send_request_btn:
requestwithHttpURLConnection();
break;
default:
break;
}
}
private void requestWithHttpURLConnection() {
new Thread(new Runnable() {
@Override
public void run() {
//这里我使用了okhttp插件实现访问网络数据,有什么不懂可以看我的前一篇博客
Okhttpclient client = new OkHttpClient();
Request request = new Request.builder()
//这里是将要访问的网络,其中10.0.2.2对Android模拟器来说是计算机本机的IP地址
.url("http://10.0.2.2/get_data.xml")
.build();
try {
final response response = client.newCall(request).execute();
String responseData = response.body().string();
//调用自定义的parseXMLWithPull()方法实现对XML数据的解析
parseXMLWithPull(responseData);
} catch (IOException e) {
e.printstacktrace();
}
}
}).start();
}
private void parseXMLWithPull(String xmlData) {
try {
//首先获得XmlPullparserFactory对象
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//获得XmlPullParser对象
XmlPullParser xmlPullParser = factory.newPullParser();
//调用setPut()方法将服务器返回的数据放入xmlPullParser中
xmlPullParser.setInput(new StringReader(xmlData));
//获得当前解析事件
int eventType = xmlPullParser.getEventType();
String id = null;
String name = null;
String version = null;
while (eventType != XmlPullParser.END_DOCUMENT) {
//获得当前解析事件的当前节点的名字,一个解析事件会有多个节点
String nodeName = xmlPullParser.getName();
switch (eventType) {
//我的理解是当前解析事件开始事件
case XmlPullParser.START_TAG:
if ("id".equals(nodeName)) {
//获得当前节点的名字
id = xmlPullParser.nextText();
} else if ("name".equals(nodeName)) {
name = xmlPullParser.nextText();
} else if ("version".equals(nodeName)) {
version = xmlPullParser.nextText();
}
break;
//我的理解是当前解析事件结束事件
case XmlPullParser.END_TAG:
if ("app".equals(nodeName)) {
//当前解析事件结束,打印出解析的结果
Log.e(TAG, "parseXMLWithPull: " + "id=" + id);
Log.e(TAG, "parseXMLWithPull: " + "name=" + name);
Log.e(TAG, "parseXMLWithPull: " + "version" + version);
}
break;
default:
break;
}
//获得下一个解析事件
eventType = xmlPullParser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
over
效果展现:
4.使用SAX方法解析XML数据
1.新建类继承Defaulthandler重写五种方法:
public class ContentHandler extends DefaultHandler {
private String nodeName;
private stringbuilder id;
private StringBuilder name;
private StringBuilder version;
private static final String TAG = "ContentHandler";
//开始xml解析的时候被调用
@Override
public void startDocument() throws SAXException {
super.startDocument();
id = new StringBuilder();
name = new StringBuilder();
version = new StringBuilder();
}
//开始解析某个节点时被调用
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
//获取当前节点名
nodeName = localName;
}
//获取当前节点的内容
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
if ("id".equals(nodeName)){
id.append(ch,start,length);
}else if("name".equals(nodeName)){
name.append(ch,start,length);
}else if("version".equals(nodeName)){
version.append(ch,start,length);
}
//Log.e(TAG, "characters: "+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh" );
}
//完成解析某个节点时被调用
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if("app".equals(localName)){
//因为characters()方法可能将一些换行符读入,所以要调用trim()方法
Log.e(TAG, "endElement: "+"id="+id.toString().trim());
Log.e(TAG, "endElement: "+"name="+name.toString().trim() );
Log.e(TAG, "endElement: "+"version="+version.toString().trim() );
//不要忘了将stringbuilder清空
id.setLength(0);
name.setLength(0);
version.setLength(0);
}
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
}
在java代码出调用:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
...........
private void requestWithHttpURLConnection() {
new Thread(new Runnable() {
@Override
public void run() {
//这里我使用了OKHttp插件实现访问网络数据,有什么不懂可以看我的前一篇博客
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
//这里是将要访问的网络,其中10.0.2.2对Android模拟器来说是计算机本机的IP地址
.url("http://10.0.2.2/get_data.xml")
.build();
try {
final Response response = client.newCall(request).execute();
String responseData = response.body().string();
//调用自定义的parseXMLWithSEX()方法实现对XML数据的解析
parseXMLWithSEX(responseData);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
private void parseXMLWithSEX(String xmlData) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
ContentHandler contentHandler = new ContentHandler();
//使用setContentHandler()方法将ContentHandler对象放入xmlReader中
xmlReader.setContentHandler(contentHandler);
//解析xml数据
xmlReader.parse(new InputSource(new StringReader(xmlData)));
} catch (Exception e) {
e.printStackTrace();
}
}
}
over,运行效果和之前的一样
相关阅读
申明:此篇博文为转载博文,原博文地址:https://www.cnblogs.com/jiaguozhilian/p/5819032.html <context-param>的作用:web.xml的配置
这2天一直在整金网奖的相关项目,比较头大的就是网页视频播放了,需要考虑各种不同格式的视频,然后找相应的视频播放器。 这次使用了2
如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78283369 我们在讲 FFmpeg 系列的时候,有提到 YUV 的。其
【JS】获取当前时间,且格式为yyyy-MM-dd hh:mm:ss
我们在前端获取当前时间:var nowDate = new Date();时间格式为:Sun May 27 2018 19:28:09 GMT+0800 (中国标准时间)但是我们想在页
web.xml中contextConfigLocation的作用
在web.xml中通过contextConfigLocation配置spring,contextConfigLocation参数定义了要装入的 Spring 配置文件。 1. 在web.xml里配