SAX 解析 XML

前端之家收集整理的这篇文章主要介绍了SAX 解析 XML前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
SAX是一种以事件为驱动的 XML API,其定义的事件流可以指定从解析器传到专门的处理程序代码的XML结构。
【优点】:解析速度快、占用内存少。特别适用于Android等移动设备。
使用步骤:
①:针对从XML中获取到的信息,需对其建立一个对象(例:Person),存放相关信息
②:新建一个类继承至DefaultHandler(DefaultHandler是已经实现了ContentHandler的接口),提供了相应的方法
复写以下方法处理:startDocument();
startElement(String uri,String localName,String qName,Attributes attributes);
characters(char[] ch,int start,int length);
endElement(String uri,String qName);
endDocument();
[方法中参数解释]示例:<newii:will>
uri: 命名空间,示例中的newii
localName: 标签名称,示例中的will
qName: 带命名空间的标签名,示例中的newii:will
attributes: 存放该标签的所有属性


ch: 当前读取到的TextNode字节数组
start: 字节开始位置
length: 当前TextNode长度
③:测试需要,建立一个person.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
<person id="23">
<name>Test</name>
<age>21</age>
</person>
</persons>
④:在应用中通过
InputStream is = MainActivity.class.getClassLoader().getResourceAsStream("person.xml");
加载需要解析的文件,并通过一个SAXParserFactory来创建具体的SAXParser
解析XML有两种形式,需要创建一个XMLReader或直接使用SAXParser
使用XMLReader方式:
XMLReader xmlReader = saxParser.getXMLReader();
xmlReader.setContentHandler(handler);
xmlReader.parse(new InputSource(is));
使用SAXParser方式:
saxParser.parse(is,handler);


【附】:android应用单元测试方法
①:在AndroidManifest.xml中添加节点
<uses-library android:name="android.test.runner" />
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="cn.gzu.xmlparsertest" />
②:建立测试类继承AndroidTestCase


【源代码如下:】
*/
/****************************************【源码】START**************************************************/

//1.Person.java

  1. public class Person {
  2. private Integer id;
  3. private String name;
  4. private short age;
  5. public Person() {
  6. super();
  7. }
  8. public Person(String name,short age) {
  9. super();
  10. this.name = name;
  11. this.age = age;
  12. }
  13. public Person(Integer id,String name,short age) {
  14. super();
  15. this.id = id;
  16. this.name = name;
  17. this.age = age;
  18. }
  19. // getter and setter ...
  20. }
  21.  
  22.  
  23. //2.SAXForHandler.java
  24. public class SAXForHandler extends DefaultHandler {
  25. private static final String TAG = "SAXForHandler";
  26. private List<Person> persons;
  27. // 记录前一个标签名称
  28. private String preTag;
  29. // 记录当前Person对象
  30. Person person;
  31. public List<Person> getPersons() {
  32. return persons;
  33. }
  34.  
  35. @Override
  36. public void startDocument() throws SAXException {
  37. persons = new ArrayList<Person>();
  38. Log.i(TAG,"********** startDocument execute **********");
  39. }
  40.  
  41. @Override
  42. public void startElement(String uri,Attributes attributes) throws SAXException {
  43. if("person".equals(localName)){
  44. for(int i=0;i<attributes.getLength();i++){
  45. Log.i(TAG," attributeName :"+attributes.getLocalName(i)+
  46. " attributeValue :"+attributes.getValue(i));
  47. person = new Person();
  48. person.setId(Integer.parseInt(attributes.getValue(i)));
  49. }
  50. }
  51. preTag = localName;
  52. Log.i(TAG,"***** startElement execute *****"+qName);
  53. }
  54.  
  55. @Override
  56. public void characters(char[] ch,int length)
  57. throws SAXException {
  58. String data = new String(ch,start,length).trim();
  59. if(!"".equals(data.trim())){
  60. Log.i(TAG," content :"+data.trim());
  61. if("name".equals(preTag)){
  62. person.setName(data);
  63. }else if("age".equals(preTag)){
  64. person.setAge(new Short(data));
  65. }
  66. }
  67. }
  68. @Override
  69. public void endElement(String uri,String qName)
  70. throws SAXException {
  71. Log.i(TAG,"***** endElement execute *****"+qName);
  72. if("person".equals(localName)){
  73. persons.add(person);
  74. person = null;
  75. }
  76. preTag = null;
  77. }
  78.  
  79. @Override
  80. public void endDocument() throws SAXException {
  81. Log.i(TAG,"********** endDocument execute **********");
  82. }
  83. }
  84.  
  85.  
  86.  
  87. //3.SAXParserUtil.java
  88. public class SAXParserUtil {
  89. public static List<Person> saxXml (InputStream is) throws Exception{
  90. SAXForHandler saxForHandler = new SAXForHandler();
  91. SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
  92. SAXParser saxParser = saxParserFactory.newSAXParser();
  93. saxParser.parse(is,saxForHandler);
  94. List<Person> persons = saxForHandler.getPersons();
  95. is.close();
  96. return persons;
  97. }
  98. }
  99.  
  100.  
  101.  
  102.  
  103. //4.单元测试类 SAXParserTest.java
  104. public class SAXParserTest extends AndroidTestCase {
  105. private static final String TAG = "SAXParserTest";
  106. public void testSAXGetPerson() throws Throwable{
  107. InputStream is = this.getClass().getClassLoader().getResourceAsStream("person.xml");
  108. List<Person> persons = SAXParserUtil.saxXml(is);
  109. String text = "";
  110. for(Person p:persons){
  111. text = text + "ID: "+p.getId()+" Name: "+p.getName()+" Age: "+p.getAge()+"\n";
  112. }
  113. Log.i(TAG,text);
  114. }
  115. }
  116.  
  117.  
  118.  
  119.  
  120. //5.MainActivity.java
  121. public class MainActivity extends Activity {
  122. @Override
  123. protected void onCreate(Bundle savedInstanceState) {
  124. super.onCreate(savedInstanceState);
  125. setContentView(R.layout.activity_main);
  126. TextView main = (TextView) findViewById(R.id.main_content);
  127. InputStream is = MainActivity.class.getClassLoader().getResourceAsStream("person.xml");
  128. try {
  129. List<Person> persons = SAXParserUtil.saxXml(is);
  130. String text = "";
  131. for(Person p:persons){
  132. text = text + "ID: "+p.getId()+" Name: "+p.getName()+" Age: "+p.getAge()+"\n";
  133. }
  134. main.setText(text);
  135. } catch (Exception e) {
  136. e.printStackTrace();
  137. }
  138. }
  139. }

//6.AndroidManifest.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="cn.gzu.xmlparsertest"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6.  
  7. <uses-sdk
  8. android:minSdkVersion="8"
  9. android:targetSdkVersion="18" />
  10.  
  11. <application
  12. android:allowBackup="true"
  13. android:icon="@drawable/ic_launcher"
  14. android:label="@string/app_name"
  15. android:theme="@style/AppTheme" >
  16. <uses-library android:name="android.test.runner" />
  17. <activity
  18. android:name="cn.gzu.xmlparsertest.MainActivity"
  19. android:label="@string/app_name" >
  20. <intent-filter>
  21. <action android:name="android.intent.action.MAIN" />
  22.  
  23. <category android:name="android.intent.category.LAUNCHER" />
  24. </intent-filter>
  25. </activity>
  26. </application>
  27. <instrumentation android:name="android.test.InstrumentationTestRunner"
  28. android:targetPackage="cn.gzu.xmlparsertest" />
  29.  
  30. </manifest>
/****************************************【源码】END**************************************************/

猜你在找的XML相关文章