XML大文件解析[分享]

2009-03-18日记:ycl
今天我研究的主题是stax.[本人吐血推荐使用stax解析xml]
昨天研究的是sax一种推式解析方法,采用事件驱动的方式进行大型xml文件的解析.
其有两个方法如下:
   startElement(String namespaceURI, String localName, String qName,
                        Attributes atts)throws SAXException
   在开始处理元素的时候可以根据namespaceURI,localName,qName,atts来处理一些逻辑.
   endElement(String namespaceURI, String localName, String qName)
                        throws SAXException
   在处理元素结束的时候可以根据namespaceURI,localName,qName来处理一些逻辑.
   characters(char[] ch, int start, int length)
   处理元素的内容.

   优点:采用事件驱动的模式进行xml的读取,只处理需要处理的元素.
   缺点:其读取方式是推的,也就是不知道已经读过的东西,也不知道将要读什么.所以如果是采用sax
        来读取大型xml一段内容的时候,必须自己定义逻辑来解析.完全破坏了xml的dom结构.

   今天研究的是stax一种拉式解析方法,也是采用事件驱动的方式进行解析.
   其实用性很简单,不用像sax那样必须继承一个handler.
   InputStream input=new FileInputStream(new File("D://cata.xml"));
   XMLStreamReader xmlStreamReader =inputFactory.createXMLStreamReader(input);
   这样就已经初始化好了一个xml的流读取.
   然后判断xmlStreamReader.hasNext()是否有下一个结点
   然后循环xmlStreamReader.next()读取下一个结点.
   (其原理和sax相似,都是以元素为单位进行读取.)
   然后处理XMLStreamReader的以下事件.在需要处理的事件中写自己的逻辑,如果找到自己的东西了,那就返回
                                //START_DOCUMENT :一个文档的开始
                                //START_ELEMENT  :一个元素的开始
                                //ATTRIBUTE      :一个元素属性子
                                //NAMESPACE      :一个命名空间声明
                                //CHARACTERS     :字符可以是文本,或是一个空格
                                //COMMENT        :一个注释
                                //SPACE          :可忽略的空格
                                //PROCESSING_INSTRUCTION  :处理指令
                                //DTD                     :一个DTD
                                //ENTITY_REFERENCE        :一个实体参考
                                //CDATA                   :Cdata节
                                //END_ELEMENT             :结束元素
                                //END_DOCUMENT            :结束文档
                                //ENTITY_DECLARATION      :一个实体声明
                                //NOTATION_DECLARATION    :一个标志声明
   之所以称stax为拉式,那是因为sax只有推,却无法停止解析,直到文档解析结束.故名思意,stax为拉,是因为      其能能在适当的时候刹车.
   其优缺点和sax一样,只是多了一个功能,那就是拉,还有就是其控制比较简单,而且Axis2等主流webservice都     采用stax.因为一个请求过去,可能给你返回很多信息,而我们要的只是仅仅一小部分.
  
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Android应用程序中接受系统分享的Excel文件解析,您需要执行以下步骤: 1. 在AndroidManifest.xml文件中添加相应的权限和Intent过滤器: ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application ...> ... <activity ...> ... <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="application/vnd.ms-excel" /> </intent-filter> ... </activity> ... </application> ``` 2. 在接收分享的Activity中处理接收到的Intent: ```java public class ReceiveShareActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_receive_share); // 获取分享的Intent Intent intent = getIntent(); String action = intent.getAction(); String type = intent.getType(); if (Intent.ACTION_SEND.equals(action) && type != null && "application/vnd.ms-excel".equals(type)) { // 获取共享的文件Uri Uri fileUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); if (fileUri != null) { // 解析Excel文件 parseExcelFile(fileUri); } } } private void parseExcelFile(Uri fileUri) { try { InputStream inputStream = getContentResolver().openInputStream(fileUri); Workbook workbook = WorkbookFactory.create(inputStream); // 处理Excel文件内容 workbook.close(); inputStream.close(); } catch (IOException | InvalidFormatException e) { e.printStackTrace(); } } } ``` 在上述代码中,您需要根据自己的需求对Excel文件进行解析处理。接收到分享的Excel文件后,通过文件Uri获取输入流,然后使用所选择的Excel解析库(如Apache POI或JExcelApi)来解析文件内容。 请注意,您还需要处理运行时权限以访问外部存储器(读取和写入权限)。上述示例代码中已添加了相应的权限声明。 希望这可以帮助您在Android应用程序中接受系统分享的Excel文件并进行解析

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值