温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

android中sax解析xml文件的示例

发布时间:2021-01-28 10:07:29 来源:亿速云 阅读:198 作者:小新 栏目:编程语言

小编给大家分享一下android中sax解析xml文件的示例,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

使用RootElement这个类来解析的,RootElement 内置了defaultHandler的子类,

RootElement 源码如下:

public class RootElement extends Element {     final Handler handler = new Handler();     /**      * Constructs a new root element with the given name.      *      * @param uri the namespace      * @param localName the local name      */     public RootElement(String uri, String localName) {         super(null, uri, localName, 0);     }     /**      * Constructs a new root element with the given name. Uses an empty string      * as the namespace.      *      * @param localName the local name      */     public RootElement(String localName) {         this("", localName);     }     /**      * Gets the SAX {@code ContentHandler}. Pass this to your SAX parser.      */     public ContentHandler getContentHandler() {         return this.handler;     }     class Handler extends DefaultHandler {         Locator locator;         int depth = -1;         Element current = null;         StringBuilder bodyBuilder = null;         @Override         public void setDocumentLocator(Locator locator) {             this.locator = locator;         }         @Override         public void startElement(String uri, String localName, String qName,                 Attributes attributes) throws SAXException {             int depth = ++this.depth;             if (depth == 0) {                 // This is the root element.                 startRoot(uri, localName, attributes);                 return;             }             // Prohibit mixed text and elements.             if (bodyBuilder != null) {                 throw new BadXmlException("Encountered mixed content"                         + " within text element named " + current + ".",                         locator);             }             // If we're one level below the current element.             if (depth == current.depth + 1) {                 // Look for a child to push onto the stack.                 Children children = current.children;                 if (children != null) {                     Element child = children.get(uri, localName);                     if (child != null) {                         start(child, attributes);                     }                 }             }         }         void startRoot(String uri, String localName, Attributes attributes)                 throws SAXException {             Element root = RootElement.this;             if (root.uri.compareTo(uri) != 0                     || root.localName.compareTo(localName) != 0) {                 throw new BadXmlException("Root element name does"                         + " not match. Expected: " + root + ", Got: "                         + Element.toString(uri, localName), locator);             }             start(root, attributes);         }         void start(Element e, Attributes attributes) {             // Push element onto the stack.             this.current = e;             if (e.startElementListener != null) {                 e.startElementListener.start(attributes);             }             if (e.endTextElementListener != null) {                 this.bodyBuilder = new StringBuilder();             }                          e.resetRequiredChildren();             e.visited = true;         }         @Override         public void characters(char[] buffer, int start, int length)                 throws SAXException {             if (bodyBuilder != null) {                 bodyBuilder.append(buffer, start, length);             }         }         @Override         public void endElement(String uri, String localName, String qName)                 throws SAXException {             Element current = this.current;             // If we've ended the current element...             if (depth == current.depth) {                 current.checkRequiredChildren(locator);                 // Invoke end element listener.                 if (current.endElementListener != null) {                     current.endElementListener.end();                 }                 // Invoke end text element listener.                 if (bodyBuilder != null) {                     String body = bodyBuilder.toString();                     bodyBuilder = null;                     // We can assume that this listener is present.                     current.endTextElementListener.end(body);                 }                 // Pop element off the stack.                 this.current = current.parent;             }             depth--;         }     } }

以上是RootElement类得源码,从源码可以看出,它只是将defaultHandler简单的处理一下。

具体应用可以参照我写的测试源码

/**	 * sax解析xml的第二种方式	 * 	用XMLReader 也是sax的一种方式	 * @return	 */	private String saxParseSecond(){	//读取src下xml文件	InputStream inputStream =	 this.getClass().getClassLoader().getResourceAsStream("saxTest.xml");	SAXParserFactory factory = SAXParserFactory.newInstance();	try {	SAXParser parse = factory.newSAXParser();	XMLReader reader = parse.getXMLReader();	reader.setContentHandler(getRootElement().getContentHandler());	reader.parse(new InputSource(inputStream));	} catch (ParserConfigurationException e) {	e.printStackTrace();	} catch (SAXException e) {	e.printStackTrace();	} catch (IOException e) {	e.printStackTrace();	}	return result;	}
/**       *        * @return 返回设置好处理机制的rootElement       */       private RootElement getRootElement(){                      /*rootElement代表着根节点,参数为根节点的tagName*/           RootElement rootElement = new RootElement("classes");           /*获取一类子节点,并为其设置相应的事件           * 这里需要注意,虽然我们只设置了一次group的事件,但是我们文档中根节点下的所有           * group却都可以触发这个事件。           * */           Element groupElement = rootElement.getChild("group");           // 读到元素开始位置时触发,如读到<group>时           groupElement.setStartElementListener(new StartElementListener() {               @Override               public void start(Attributes attributes) {   //                Log.i("TEST", "start");                  String groupName =  attributes.getValue("name");                String groupNum =  attributes.getValue("num");                result = result+"groupName ="+groupName+"groupNum = "+groupNum+"\n";             }           });           //读到元素结束位置时触发,如读到</group>时           groupElement.setEndElementListener(new EndElementListener() {               @Override               public void end() {               }           });           Element personElement = groupElement.getChild("person");         //读取<person>标签触发         personElement.setStartElementListener(new StartElementListener() {	@Override	public void start(Attributes attributes) {	 String personName =  attributes.getValue("name");	             String age =  attributes.getValue("age");	             result = result+"personName ="+personName+"age = "+age+"\n";	}	});         //读取</person>标签触发         personElement.setEndElementListener(new EndElementListener() {	@Override	public void end() {	}	});                  Element chinese = personElement.getChild("chinese");   //        chinese.setTextElementListener(new TextElementListener() { // //	@Override //	public void end(String body) { //	// TODO Auto-generated method stub // //	} // //	@Override //	public void start(Attributes attributes) { //	// TODO Auto-generated method stub // //	} //	});         // 读到文本的末尾时触发,这里的body即为文本的内容部分           chinese.setEndTextElementListener(new EndTextElementListener() {               @Override               public void end(String body) {               	Pattern p = Pattern.compile("\\s*|\t|\r|\n"); 	Matcher m = p.matcher(body); 	body = m.replaceAll("");              	result = result+"chinese ="+body;             }           });                      Element english = personElement.getChild("english");           english.setEndTextElementListener(new EndTextElementListener() {               @Override               public void end(String body) {               	Pattern p = Pattern.compile("\\s*|\t|\r|\n"); 	Matcher m = p.matcher(body); 	body = m.replaceAll("");                 result = result+"english ="+body+"\n";             }           });           return rootElement;                  }


android中sax解析xml文件的示例

我们都知道通过SAXParser对象解析xml的方式,这里我们又从代码中看到了利用另一个对象XMLReader进行解析,那么两者到底有什么联系和区别呢?

    其实SAXParser是在SAX 1.0 定义的,而XMLReader则是在2.0中才开始出现的。你可以认为XMLReader的出现是为了替代SAXParser解析的,两者本质上干的事情是一样的,只不过XMLReader的功能更加的强悍而已。  

关于XMLReader的获取方式,除了通过SAXParser的getXMLReader方法获得之外,我们还可以通过以下两种方式。

XMLReader parser=XMLReaderFactory.createXMLReader(); (1) XMLReader parser=XMLReaderFactory.createXMLReader(String className); (2)

看完了这篇文章,相信你对“android中sax解析xml文件的示例”有了一定的了解,如果想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI