ホームページ >バックエンド開発 >XML/RSS チュートリアル >XML データ解析の 3 つの方法を詳しく説明したサンプル コード
概要
データ対話形式としての Xml には、XML データの生成と解析が含まれます。ここでは、Xml 解析の 3 つの方法について説明します。
2. Dom の解析
1. パーサー ファクトリ オブジェクト (DocumentBuilderFactory オブジェクト) を作成します
3. Document オブジェクトを作成します
例えば、次のファイルを解析します
解析コードは次のとおりです<?xml version="1.0" encoding="utf-8"?> <students> <student id = "1001"> <id>1</id> <name>杨威</name> <address>大连</address> <age>21</age> </student> <student id = "1002"> <id>2</id> <name>劉海洋</name> <address>深圳</address> <age>23</age> </student> <student id = "1003"> <id>3</id> <name>王小波</name> <address>廣州</address> <age>22</age> </student> </students>3. 要素 ele = doc.getDocumentElement(); 要素を取得すると、要素の値もノードになります。 element.getFirstChild().getNodeValue() メソッドの値によって取得されます。 3. XML 内の空白スペースもノードおよびテキスト タイプです。 4. SAX 解析1. SAXParserFactory オブジェクトを作成します2. DefaultHandler クラスを継承し、メソッドをオーバーライドする MyHandler を作成します。 4. sp.parse(new File("student.xml"), new MyHandler(list));
[code]package com.kuxiao.train.xml; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; public class XmlParseTest { public static void main(String[] args) throws Exception { //xml doc解析步骤 //1、获取解析工厂对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); //2、构建解析器对象 DocumentBuilder db = dbf.newDocumentBuilder(); //3、构建docment对象 Document doc = db.parse(new File("person.xml")); Element ele = doc.getDocumentElement(); //实现解析逻辑 NodeList list = doc.getElementsByTagName("student"); for(int i = 0; i < list.getLength();i++) { Element element = (Element) list.item(i); String attrid = element.getAttribute("id"); System.out.println("attrid = " + attrid); Element element1 = (Element) element.getElementsByTagName("id").item(0); String id = element1.getFirstChild().getNodeValue(); System.out.println(id); element1 = (Element) element.getElementsByTagName("name").item(0); String name = element1.getFirstChild().getNodeValue(); System.out.println(name); element1 = (Element) element.getElementsByTagName("address").item(0); String address = element1.getFirstChild().getNodeValue(); System.out.println(address); } } }SAX はイベント モデルに基づいており、順次解析され、内部実装はオブザーバー モードであるという利点があります。メモリをほとんど消費しないこと、効率が高いこと、欠点はエンコードが比較的複雑なことです。 5. プル解析1. この解析メソッドは JDK に付属していないため、サードパーティのライブラリをインポートする必要があります3. XmlPullParser オブジェクトを作成します4. setInput(is," utf-8”)5. 対応するイベントタイプの処理 xpp.next() 次のイベントタイプ
[code]package com.kuxiao.train.xml.sax; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Stack; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class TestSax { public static void main(String[] args) throws Exception { SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); List<Student> list = new ArrayList<>(); sp.parse(new File("student.xml"), new MyHandler(list)); System.out.println(list); } } class MyHandler extends DefaultHandler { private Stack<String> stack = new Stack<>(); private Student student; private List<Student> mList = null; public MyHandler(List<Student> list) { this.mList = list; } @Override public void startDocument() throws SAXException { System.out.println("解析文档开始了..."); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if(qName.equals("学生")) { student = new Student(); if(attributes.getLength() != 0) { for(int i = 0; i < attributes.getLength();i++) { String id = attributes.getValue(i); student.setId(Integer.parseInt(id)); } } } /*if(qName.equals("姓名")) { stack.push(qName); } if(qName.equals("年龄")) { stack.push(qName); } if(qName.equals("性别")) { stack.push(qName); }*/ stack.push(qName); } @Override public void characters(char[] ch, int start, int length) throws SAXException { String qName = stack.peek(); if(qName.equals("性别")){ student.setGender(new String(ch,start,length)); } if(qName.equals("姓名")){ student.setName(new String(ch,start,length)); } if(qName.equals("年龄")){ student.setAge(new String(ch,start,length)); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { stack.pop(); if(qName.equals("学生")) { mList.add(student); student = null; } } @Override public void endDocument() throws SAXException { System.out.println("解析文档结束了....."); } }
以上がXML データ解析の 3 つの方法を詳しく説明したサンプル コードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。