解析方法:DOM、SAX、PULL
DOM:将xml转化为树进行遍历
public void DOMParser() {
try {
// 1.创建DocumentBuilder实例
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
// 2.创建Document实例
Document doc = builder.parse(file);
// 3.获取xml文件的根节点(persons)
Element element = doc.getDocumentElement();
// 4.获取根节点的子节点列表(person的列表)
NodeList personList = element.getElementsByTagName("person");// TODO
// NodeList personList = element.getChildNodes();//这个方法不行
// 5. 遍历所有的person节点
for (int i = 0; i < personList.getLength(); i++) {
// 6.获取单个person节点
Element person = (Element) personList.item(i);
// 7.读取person的属性
String id = person.getAttribute("id");
System.out.println("person id: " + id);
// 8.获取person的子节点列表
NodeList childList = person.getChildNodes();
// 9.遍历person子节点
for (int j = 0; j < childList.getLength(); j++) {
// 10.访问子节点
Node child = (Node) childList.item(j);
if (child.getNodeType() == Node.ELEMENT_NODE) {// 如果子节点是一个元素节点
// 11.获取元素名称
String name = child.getNodeName();
if ("name".equals(name)) {// 获取person name
System.out.println("名字: "
+ child.getFirstChild().getNodeValue());
} else if ("age".equals(name)) {// 获取person age
System.out.println("年龄:"
+ child.getFirstChild().getNodeValue());
}
}
}
}
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
2.SAX:从上往下挨个遍历标签
// 1.创建一个Handler类,继承DefaultHandler
class SaxHandler extends DefaultHandler {
/** 上一个节点名称 */
private String tag;
// 需要重写五个方法:
// 1.startDocument():开始文档时做预处理
// 2.endDocument():结束文档时做善后处理
// 3.startElement():遇到开始标签是调用该方法
// 4.endElement():遇到结束标签时调用该方法
// 5.characters():内容
public void startDocument() throws SAXException {
System.out.println("调用startDocument()方法");
}
public void endDocument() throws SAXException {
System.out.println("调用endDocument()方法");
}
// 在该方法中读取标签的属性
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("调用startElement()方法"+"localName:"+localName+"qName:"+qName);
if ("person".equals(qName)) {
System.out.println("person: ");
System.out.println(" id: " + attributes.getValue("id"));
}
tag = qName;
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("调用endElement()方法");
}
// 读取标签内容
// 每次都开始结束标签时都调用
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println("调用characters()方法");
String data = new String(ch, start, length);
if ("name".equals(tag)) {
System.out.println("name: " + data);
} else if ("age".equals(tag)) {
System.out.println("age: " + data);
}
}
}
// 2.sax 解析
public void SAXParser() {
try {
//2.1创建解析器
javax.xml.parsers.SAXParser parser = SAXParserFactory.newInstance()
.newSAXParser();
//2.2创建处理器
SaxHandler handler = new SaxHandler();
//2.3创建文件输入流
FileInputStream fis = new FileInputStream(file);
//2.4解析文件
parser.parse(file, handler);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
3.Pull:与SAX类似,在android开发中应用较多
public static void xmlPullParser(InputStream is) {
try {
// 1.获取输入流
// 2.获取解析器
XmlPullParser parser = Xml.newPullParser();
parser.setInput(is, "utf-8");
// 3.获取事件类型
int eventType = parser.getEventType();
// 4.遍历节点
while(eventType != XmlPullParser.END_DOCUMENT){
switch (eventType) {
case XmlPullParser.START_DOCUMENT://文件开启
break;
case XmlPullParser.START_TAG://标签开始
//4.1获取节点名称
String name = parser.getName();
if(name.equals("person")){
//4.2 获取节点属性值
String id = parser.getAttributeValue(0);
}else if(name.equals("name")){
//4.3 获取下个文本值
System.out.println("name: "+ parser.nextText());
}else if(name.equals("age")){
System.out.println("age: "+ parser.nextText());
}
break;
case XmlPullParser.END_TAG://标签结束
break;
default:
break;
}
eventType = parser.next();
}
is.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。