使用java自带的xml解析器解析xml

使用java自带的xml解析器解析xml,
其实我不推荐,可以用Dom解析,或其他的方式,
因为Java自带的解析器使用不但麻烦,且还有bug出现。

它要求,针对不同的xml(结构不同),必须写对应的handler处理类,
而Dom解析可以写通用的方法(前提是要写出通用逻辑)来处理,开发比较快。
下面上代码

  1 //------------------ main point ---------------------
  2 javax.xml.parsers.SAXParserFactory
  3 public static void main(String[] args)
  4     {
  5  //cdu 存放结果的对象
  6  CS3drawUnit cdu=new CS3drawUnit();
  7
  8  SAXParserFactory factory = SAXParserFactory.newInstance();
  9
 10   SAXParser parser;
 11                 try {
 12                     parser = factory.newSAXParser();
 13
 14                     /* // 方式一
 15                     InputStream is=new ByteArrayInputStream(strxml.getBytes("UTF-8"));
 16                     parser.parse(is, new Apphandler(cdu));
 17                     */
 18
 19                     // 方式二
 20                     parser.parse(new File("cs3.xml"),new Apphandler(cdu));
 21                     }
 22                     catch (ParserConfigurationException e) {
 23                         // TODO Auto-generated catch block
 24                         e.printStackTrace();
 25                     } catch (SAXException e) {
 26                         // TODO Auto-generated catch block
 27                         e.printStackTrace();
 28                     } catch (IOException e) {
 29                         // TODO Auto-generated catch block
 30                         e.printStackTrace();
 31                     }
 32     }
 33
 34 // 存放结果的实体
 35 //------------------CS3drawUnit bean---------------------
 36 public class CS3drawUnit {
 37
 38     //可以有多个 fields,因为太多我省略了好多
 39     private String XWallThickness="";
 40
 41     public String getXWallThickness() {
 42         return XWallThickness;
 43     }
 44     public void setXWallThickness(String xWallThickness) {
 45         XWallThickness = xWallThickness;
 46     }
 47
 48 }
 49
 50 // 这就是处理类handler
 51 //------------------Apphandler ---------------------
 52 import org.xml.sax.Attributes;
 53 import org.xml.sax.SAXException;
 54 import org.xml.sax.helpers.DefaultHandler;
 55
 56 public class Apphandler extends DefaultHandler {
 57
 58     /*
 59     <field>
 60     <name>Type / tubes in face</name>
 61     <value>A (1/2" OD) / 16</value>
 62     </field>
 63
 64     */
 65
 66
 67     Unit u=null;
 68     //内部类 为了在characters方法中调用,使代码显的清晰
 69     public class Unit{
 70
 71         private String xname="";
 72         private String xvalue="";
 73         private String xmodelNo ="";
 74         private String xahTag ="";
 75
 76
 77         public String getXahTag() {
 78             return xahTag;
 79         }
 80         public void setXahTag(String xahTag) {
 81             this.xahTag = xahTag;
 82         }
 83         public String getXname() {
 84             return xname;
 85         }
 86         public void setXname(String xname) {
 87             this.xname = xname;
 88         }
 89         public String getXvalue() {
 90             return xvalue;
 91         }
 92         public void setXvalue(String xvalue) {
 93             this.xvalue = xvalue;
 94         }
 95         public String getxmodelNo() {
 96             return xmodelNo;
 97         }
 98         public void setxmodelNo(String xmodelNo) {
 99             this.xmodelNo = xmodelNo;
100         }
101
102
103     }
104     CS3drawUnit cdu=null;
105
106     private final int xname_STATE = 1;
107     private final int xvalue_STATE = 2;
108     private final int xmodelNo_STATE = 3;
109     private final int xahTag_STATE = 4;
110
111
112    private int currentState;
113
114    public  Apphandler(CS3drawUnit cdu)
115    {
116        this.cdu=cdu;
117        currentState=0;
118        u=new Unit();
119    }
120
121      //获取解析结果,可以再处理,此处把结果再加工,set到cdu实例中返回
122     ///@Override
123     public void endElement(String uri, String localName, String qName)
124             throws SAXException {
125
126
127           if(qName.equals("modelNo")&& u!= null){
128               cdu.setXModelNo(u.getxmodelNo());
129           }
130           if(qName.equals("ahTag")&& u!= null){
131               cdu.setXAhTag(u.getXahTag());
132           }
133
134     }
135
136     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
137         // TODO Auto-generated method stub
138         //System.out.println("qName:"+qName);
139             if (qName.equals("field")){
140                  u=new Unit();
141                  return;
142             }
143
144             if (qName.equals("name")){
145                 currentState = xname_STATE;
146                 return ;
147             }
148
149             if (qName.equals("value")){
150                 currentState = xvalue_STATE;
151                 return ;
152             }
153             if (qName.equals("modelNo")){
154                 currentState = xmodelNo_STATE;
155                 return ;
156             }
157
158             if (qName.equals("ahTag")){
159                 currentState = xahTag_STATE;
160                 return ;
161             }
162     }
163
164
165     public void characters(char[] ch, int start, int length) throws SAXException {
166
167         //length这个值在某些情况下,会被裁断(莫名其妙),估计是bug,遇到过一回,
168         //所以我在后来不让它解析出错时的字段,改用Dom解析。
169         String theString = new String(ch, start, length);
170
171         switch(currentState)
172         {
173             case xname_STATE:
174                 u.setXname(theString);
175                 currentState = 0;
176                 break;
177
178             case xvalue_STATE:
179                 u.setXvalue(theString);
180                 currentState = 0;
181                 break;
182             case xmodelNo_STATE:
183                 u.setxmodelNo(theString);
184                 currentState = 0;
185                 break;
186             case xahTag_STATE:
187                 u.setXahTag(theString);
188                 currentState = 0;
189                 break;
190         }
191     }
192
193 }

若转载请标注  :转自 博客园 : http://www.cnblogs.com/rojas/p/4013297.html

时间: 2024-10-10 07:54:35

使用java自带的xml解析器解析xml的相关文章

无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.demo1" /> 上面targetPackage指定的包要和应用的package相同. (2)在清单文件中ap

使用Pull解析器生成XML文件和读取xml文件

有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,这里推荐大家使用Pull解析器. 一.布局界面 [html] view plaincopyprint? <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

Android开发系列(八):采用Pull解析器解析和生成XML内容

因为有些时候,应用的数据是采用XML文件的格式存放的,所以我们需要知道怎么从XML文件中读取这些数据 在Android中可以通过SAX.DOM.pull解析XML文件. 在本篇博文中主要介绍采用Pull解析器解析和生成XML内容. 介绍:在Android已经集成了Pull解析器,所以无需添加任何的jar文件.在Android中本身用到的各种xml文件,其内部也是采用Pull解析器进行解析的. 一.采用Pull解析器解析XML文件内容 首先,我们需要先建立一个Android Project项目,名

使用XML序列化器生成XML文件和利用pull解析XML文件

首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message> <sms> <body> 陈驰0 </body> <date> 1462162910995 </date> <address> 1380 </address> <type> 1 </type> &

使用Pull解析器生成XML文件

有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,这里推荐大家使用Pull解析器. 1.使用Pull解析器生成一个与itcast.xml文件内容相同的myitcast.xml文件,代码在下方 public static String writeXML(List<Person> persons, Writer wri

Android下使用pull解析器生成XML文件、读取XML文件

Android下使用Pull解析器 1,Pull解析器的运行方式与SAX解析器相似.它提供了类似的事件,如:开始元素和结束元素事件. 2,使用parser.next()可以进入下一个元素并触发相应事件. 3,事件将作为一个int数值被发送,因此可以使用一个switch对相应的事件进行处理. 4,当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值. 5,相关API: 获得当前节点事件类型:parser.getEventType(); 获得下一节点事件类型

使用DOM解析器解析XML文件 学习笔记

dom解析和dom4j原理一致 Node是所有元素的父接口 常用的API: DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();取得DOM解析器工厂 DocumentBuilder domParser = factory.newDocumentBuilder();取得DOM解析器 domParser.parse(*.xml)加载需要解析的XML文件 Document.getDocumentElement()取

rest-Assured-解析json错误-需使用预定义的解析器解析

报错信息: java.lang.IllegalStateException: Expected response body to be verified as JSON, HTML or XML but content-type 'text/plain' is not supported out of the box.Try registering a custom parser using: RestAssured.registerParser("text/plain", <p

解析器解析全过程

首先,我们先让大家看一下python解析器的全流程: 我们编辑器编写好源代码->保存成文件.如果源代码中有编码声明而且用的编辑器支持该语法,那么该文件就以相应的编码方式保存在磁盘中. 注意:编码声明和源文件的编码不一定是一致的,你完全可以在编码声明中声明编码为utf-8,但是用GB2312来保存源文件.当然,我们不可能自寻烦恼,故意写错,而且,好的IDE也能强制保证两者的一致性,但是,如果我们用记事本或者editplus等编辑器来编写代码的话,一不小心就会出现这种问题的. 得到一个.py文件后,