解析XML数据的第二种方式为SAX方式,使用文章-24中的xml文件进行解析,服务器为Apache服务器(对于构建方式见文章-24)
public class XmlSaxGetActivity extends AppCompatActivity {
private Button send_http;
private TextView get_http;
private String responseData;
public class MyHandler extends DefaultHandler{
private String nodeName;
private StringBuilder id;
private StringBuilder name;
private StringBuilder version;
@Override
public void startDocument() throws SAXException {
//开始读取xml文件
Log.v("startDocument","startDocument");
id = new StringBuilder();
name = new StringBuilder();
version = new StringBuilder();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
//记录当前节点名字
Log.v("startElement","startElement");
nodeName = localName;
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
//根据当前的节点名判断将内容添加到哪一个StringBuilder对象中
Log.v("characters","characters");
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);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
//判断其结束符号是否为app
Log.v("endElement","endElement");
if("app".equals(localName)){
Log.v("SAXHandler", "id :" + id.toString().trim());
Log.v("SAXHandler", "name :" + name.toString().trim());
Log.v("SAXHandler", "version :" + version.toString().trim());
id.setLength(0);
name.setLength(0);
version.setLength(0);
}
}
@Override
public void endDocument() throws SAXException {
//结束Document标志
Log.v("endDocument","endDocument");
super.endDocument();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ok_http);
send_http = findViewById(R.id.send_Okhttp);
get_http = findViewById(R.id.get_Okhttp);
send_http.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendRequestWithOkHttp();
}
});
get_http.setMovementMethod(new ScrollingMovementMethod());
}
private void sendRequestWithOkHttp() {
//请求网络操作必须要在子线程中进行(主线程会报错)
new Thread(new Runnable() {
@Override
public void run() {
try {
//创建一个OkHttpClient实例
OkHttpClient client = new OkHttpClient();
//如果要发起一条HTTP请求,就需要创建一个Request对象
//GET请求
Request request = new Request.Builder()
.url("http://192.168.1.114/W.xml")
.build();
//POST请求(需要一个RequestBody来存放需要提交的参数)
// RequestBody requestBody = new FormBody.Builder()
// .add("arg1","123")
// .add("arg2","123456")
// .build();
// Request request = new Request.Builder()
// .url("http://www.baidu.com")
// .post(requestBody)
// .build();
//调用newCall()方法来创建一个Call对象,并调用他的execute()方法来发送请求并获取服务器返回的数据
Response response = client.newCall(request).execute();
//得到返回的服务器的数据内容
responseData = response.body().string();
//-----------------------------------------------
//这里开始处理接收到的xml文件
parseXMLWithSax(responseData);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
private void parseXMLWithSax(String xmlData) {
try {
//创建工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
MyHandler handler = new MyHandler();
xmlReader.setContentHandler(handler);
//使用我们自己写的Handler进行解析xml数据
xmlReader.parse(new InputSource(new StringReader(xmlData)));
}catch (Exception e){
e.printStackTrace();
}
}
}