sax解析xml的特殊字符解决方法
来源:互联网 发布:三坐标测量自动编程 编辑:程序博客网 时间:2024/06/09 23:39
1. 如果特殊字符很少,并且出现在特定的tag里,最简单的方法就是生成xml的时候加入标志“<![CDATA[formula]]>”如,
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><Root><ITEM><AreaID>1</AreaID><ParentID>0</ParentID><AreaName>0</AreaName></ITEM><ITEM><AreaID>2</AreaID><ParentID>1</ParentID><AreaName><![CDATA[aaa<bbb?1:2]]></AreaName></ITEM></Root>
2. 如果不确定哪一个tag会有像<,>等的特殊字符,或者出现特殊字符的tag比较多,则最好使用转义
因为SAX解析判断是否是一个element是通过<>,</>来判断的,所以想大于号、小于号等为了避免混淆,要使用转义
小于号 < <
大于号 > >
与号 & &
单引号 ‘ '
双引号 “ "
比如,
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><Root><ITEM><AreaID>1</AreaID><ParentID>0</ParentID><AreaName>0</AreaName></ITEM><ITEM><AreaID>2</AreaID><ParentID>1</ParentID><AreaName>a<b</AreaName></ITEM></Root>
<AreaName>a<b</AreaName>解析的时候,sax解析AreaName的时候进入startElement进入一次,会进入characters至少3次(说至少的意思是有些tag中间会有空格或TAB,本例中只会调用3次),分别会返回”a“, "<", "b",把这三次拼接起来就是我们需要的字串,完整程序如下
package com.kingman.hello.xml;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;import android.util.Log;public class AreaHandler extends DefaultHandler{private static final String TAG = "AreaHandler"; final int AREA_ID = 1;final int PARENT_ID = 2;final int AREA_NAME = 3;AreaFeed mAreaFeed;AreaItem mAreaItem;private int currentstate;private StringBuffer str = null; public AreaHandler() {}@Overridepublic void startDocument() throws SAXException { Log.v(TAG, "startDocument");mAreaFeed = new AreaFeed();mAreaItem = new AreaItem();}@Overridepublic void endDocument() throws SAXException { Log.v(TAG, "endDocument");}@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException { Log.v(TAG, "startElement"); str = new StringBuffer();if (localName.equals("ITEM")){mAreaItem = new AreaItem();return;}if (localName.equals("AreaID")){currentstate = AREA_ID;return;}if (localName.equals("ParentID")){currentstate = PARENT_ID;return;}if (localName.equals("AreaName")){currentstate = AREA_NAME;return;}}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException { Log.v(TAG, "endElement"); super.endElement(uri, localName, qName);if (localName.equals("ITEM")){mAreaFeed.addItem(mAreaItem);return;}switch (currentstate) { case AREA_ID: mAreaItem.setmAreaID(str.toString()); currentstate = 0; break; case PARENT_ID: mAreaItem.setmParentID(str.toString()); currentstate = 0; break; case AREA_NAME: Log.v(TAG, "AREA_NAME - str = " + str); mAreaItem.setmAreaName(str.toString()); currentstate = 0; break; default: return; }}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {String theString = new String(ch,start,length);str.append(theString);Log.v(TAG, "str = " + str);}public AreaFeed getFeed() {return mAreaFeed;}}
package com.kingman.hello.xml;import java.io.InputStream;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.InputSource;import org.xml.sax.XMLReader;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.widget.ListView;import android.widget.SimpleAdapter;import com.kingman.hello.R;public class SAXParseActivity extends Activity{public final String TAG = "XMLParseActivity";private AreaFeed feed = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(R.layout.xml_listview);feed = getFeed(R.raw.area);showListView();}private AreaFeed getFeed(int r_id) {try { InputStream inputStream = null; //xml file 放到 assets目录中的 inputStream = getResources().getAssets().open("blog.xml"); //inputStream = openFileInput("blog.xml"); //创建SAX解析工厂 SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); XMLReader xmlreader = parser.getXMLReader(); //为XMLReader设置内容处理器 AreaHandler xmlHandler = new AreaHandler(); xmlreader.setContentHandler(xmlHandler);//设置事件处理函数 InputSource is = new InputSource(inputStream); //开始解析文件 xmlreader.parse(is); return xmlHandler.getFeed(); } catch (Exception ee){ return null; }}private void showListView() {Log.v(TAG, "showListView"); ListView itemlist = (ListView) findViewById(R.id.itemlist); if (feed == null) { setTitle("Can't display"); return; } SimpleAdapter adapter = new SimpleAdapter(this, feed.getAllItemsForListView(), R.layout.xml_three_textview, new String[] { AreaItem.AREA_ID, AreaItem.PARENT_ID , AreaItem.AREA_NAME}, new int[] { R.id.tv1 , R.id.tv2, R.id.tv3}); itemlist.setAdapter(adapter); itemlist.setSelection(0); }}
- sax解析xml的特殊字符解决方法
- Sax解析xml遇到特殊字符问题
- sax解析内容中含有xml特殊字符转义
- sax解析内容中含有xml特殊字符转义实体的解决方案
- xml解析特殊字符
- XStream解析xml的特殊字符支持
- xml的sax解析
- xml的sax解析
- xml的SAX解析
- XMl的SAX解析
- SAX解析XML出现文本丢失的解决方法之一
- java中使用sax解析xml的解决方法
- java中使用sax解析xml的解决方法
- java中使用sax解析xml的解决方法
- java中使用sax解析xml的解决方法
- XML的特殊字符
- XML的特殊字符
- XML 文件中出现 & ? ? 这类特殊字符的一种解决方法
- STK学习资料---我是否可以跟在火场的消防队员保持联系?
- activity四种启动模式
- java 排序
- HttpWatch工具简介及使用技巧(转载)
- linux设备驱动归纳总结(六):2.分享中断号
- sax解析xml的特殊字符解决方法
- make clean与make distclean的区别
- [C#源代码]百度网盘地址批量转换工具
- TCP协议
- 单线程模型中Message,Handler,Message Queue,Looper之间的关系
- UI -- UIPickerView选取器
- Cocos2d-x 2.x设置竖屏方法 android ios
- linux设备驱动归纳总结(六):3.中断的上半部和下半部——tasklet
- inline const #define