您的位置:首页 > 其它

SAX解析xml文件

2016-03-16 13:04 447 查看
    实现功能:将部署在服务器上的xml文件转化成流的形式和继承DefaultHandler类的自定义MyHandler类的提交给XMLParser类通过SAXParserFactory利用工厂模式对文件进行解析

要解析xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>

<persons>
<person id="23">
<name>jack</name>
<age>21</age>
</person>

<person id="25">
<name>july</name>
<age>24</age>
</person>
</persons>


1,对MyHandler类进行分析

有以下几类成员:
private HashMap<String, String> map = null;
private ArrayList<HashMap<String, String>> list = null;
private String nodeName;
private String currentTag;
private String currentValue;
hashmap 对象用来封装每个标签的属性和属性的值

list用来存放每个person标签的map对象

nodeName 表示传入要解析的标签名称

crruentTag 表示当前正在解析的标签名称

crruentValue 表示当前正在解释标签里面的内容

主要继承的方法有以下几个:

@Override
public void startDocument() throws SAXException {
list = new ArrayList<HashMap<String, String>>();
}
// 将每个元素的属性放入map中
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// 解析的元素为当前传进来的元素
if (qName.equals(nodeName)) {
map = new HashMap<String, String>();
}
// 遍历元素的属性并加入map中,如元素中的id属性,
if (attributes != null && map != null) {
for (int i = 0; i < attributes.getLength(); i++) {
map.put(attributes.getQName(i), attributes.getValue(i));
}
}
currentTag = qName;
}

// 这里面是元素里面的内容
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (currentTag != null && map != null) {
currentValue = new String(ch, start, length);
if (currentValue != null && !currentValue.trim().equals("")
&& !currentValue.trim().equals("/n")) {
map.put(currentTag, currentValue.trim());
}
}
//解析标签后将当前标签的名称和值都置为空
currentTag = null;
currentValue = null;
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {

if (qName.equals(nodeName)) {
list.add(map);
map = null;
}

}DefaultHandler类解析xml文件的顺序参考:http://blog.csdn.net/neu_yousei/article/details/22647937?utm_source=tuicool&utm_medium=referral

2,对XmlReader类的分析

 核心代码:public static List<HashMap<String, String>> readXml(InputStream is,
String nodeName) {

// 创建一个解析xml的工厂对象
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser parser = factory.newSAXParser();
MyHandler myHandler = new MyHandler(nodeName);
parser.parse(is, myHandler);
is.close();
return myHandler.getList();

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException | SAXException e) {

e.printStackTrace();
}

return null;

}3,对网页的xml文件的或许及转化成inputStream则参考
public static InputStream getInputStream() {
InputStream inputStream = null;
try {
URL url = new URL(PATH);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(3000);
conn.setDoInput(true);
conn.setRequestMethod("GET");
inputStream = conn.getInputStream();

} catch (Exception e) {
// TODO: handle exception
}
return inputStream;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: