ContentHandler 中的属性

SAX解析XML实例 XML可扩展标记语言,是Internet环境中的跨平台的依赖于内容的技术。是当前处理结构化文档信息的有力工具。 本文给出用SAX解析XML实例。 SAX只能够读取XML,不能修改XML,但是SAX占资源小,适合用于android。 sax采用流式处理的方式,当遇到一个标签时,它并不会记录下以前的标签,也就是说你只能知道当前的标签的名字和属性。 事件接口:ContentHandler实现了D 阅读详情
在上一篇技巧文章的有关用 ContentHandler 进行数据处理的内容中,作者惟一没有讨论到的一个方面就是属性处理。虽然属性最常用于 XML 文档和 XML 处理程序之间的信息传输,但是它们通常也包含有用的业务数据。在本技巧文章中,Brett 为您展示了 SAX 是如何处理元素并报告这些元素的,以及如何用代码提取元素数据。

如果您一直在阅读本技巧系列,那么您可能以为会读到有关 SAX ErrorHandler 接口的内容 -- 我在上一篇技巧文章结束时是这样承诺的,当然我也是这么打算的。不过,我收到了一些请求和建议,让我讨论在前几篇技巧文章中一直讨论的 ContentHandler 接口的最后一个方面。由于这是一个不错的请求,而且还涉及 XML 处理的其他非常常见的内容,我想值得现在讨论它(对于只希望了解错误处理及类似内容的读者,我希望你们可以等到下一篇技巧文章!)。

当然,这项请求是针对 XML 属性处理的。读过最近几篇技巧文章后,我相信您对于安装、注册和使用 ContentHandler s 已经没有问题了,并且可以毫无问题地找到特定的元素或者得到其文本内容。不过,我没有提到如何获得一个属性的值。这是一个相当简单的过程,所以我会在本技巧中对它作一个简单的介绍。

首先,您需要找到要获取其值的这个属性(或者几个属性)。要完成这项任务,应该首先确定这个属性出现在哪个元素上。可以通过查看感兴趣的 XML 文档(清单1展示了一个简单的例子)、或者浏览一个 DTD (在清单2中展示)或者 XML Schema 做到这一点。它们都是有效的方法 -- 您可以选择一种自己喜欢的方法。

 

清单1. 一个简单的 XML 文档

<?xml version="1.0"?>
<root>
  <some-element some-attribute="value">Some content in the element</some-element>
  <some-other-element>
    <child age="1" birthDate="06/02/2003">
      More content
    <child>
  </some-other-element>
<root>
清单2. 一个简单的 XML DTD (用于清单1)
<!ELEMENT root (some-element*, some-other-element+)>
<!ELEMENT some-element (#PCDATA)>
<!ATTLIST some-element
          some-attribute	CDATA	#REQUIRED
>
<!ELEMENT some-other-element (child+)>
<ELEMENT child (#PCDATA)>
<!ATTLIST child
          age                   CDATA	#REQUIRED
          birthDate             CDATA	#REQUIRED
>
为了使用这个例子,这里假定要查找的是 birthDate 属性。不管查看的是 XML 文档还是 DTD(或者一个XML Schema),
都可以确定这个 birthDate 属性是附加在 child 元素上的。所以第一项任务是找出这个元素。当然,您已经知道如何去做了,
所以这是轻而易举的事情 -- 如果您忘了如何去做,那么可以参看清单3作为复习。
清单3. 找出子元素
public void startElement (String uri, String localName,
		       String qName, Attributes atts)	throws SAXException {
	
	    if (localName.equals("child")) {
		    // Deal with the attributes
	    }
}
 
现在,您要开始使用一个新的 SAX 类 Attributes 。确切地说,它实际上是一个接口,您的解析器提供商提供了这个接口的
一些类型的实现。不管使用哪种实现,您只需要处理公共接口方法,所以无需担心在外壳里面发生的事情。首先,看一下清单4,
它实质上就是 Attributes 接口。
 
清单4. SAX Attributes 接口 

package org.xml.sax;
public interface Attributes
{
    ////////////////////////////////////////////////
    // Indexed access.
    ////////////////////////////////////////////////
    public abstract int getLength ();
    public abstract String getURI (int index);
    public abstract String getLocalName (int index);
    public abstract String getQName (int index);
    public abstract String getType (int index);
    public abstract String getValue (int index);
    ////////////////////////////////////////////////
    // Name-based queries
    ////////////////////////////////////////////////
    public int getIndex (String uri, String localName);
    public int getIndex (String qName);
    public abstract String getType (String uri, String localName);
    public abstract String getType (String qName);
    public abstract String getValue (String uri, String localName);
    public abstract String getValue (String qName);
}

这是很容易理解的,本技巧的其余部分并没有什么启示性(revelatory)。正如本接口的注释所表明的,可以通过属性的名称或

者其索引访问它。如果您知道属性的名称(就像在这个虚构的例子一样 -- birthDate ),我建议使用基于名称的查询,如清单5所示。

清单5. 查找 birthDate 属性 
public void startElement (String uri, String localName,
     String qName, Attributes atts)throws SAXException { 
     if (localName.equals("child")) {
      String childValue = atts.getValue("", "birthDate");
   // Do something with the value
  }
}

很简单,是不是?注意我本来可以采用取 qName 中值的方式( getValue(String qName) ),但是为了自我文档编制(self-documentation)的方便,我一般喜欢传入一个 URI 和本地名称。这里没有 URI,所以使用一个空字符串就可以了。也可以使用 getValue("birthDate") 得到同样的结果。

您还可以用基于索引的访问方法来使用属性。如果知道属性的名称的话,一般不会使用这种方法。事实上,在这里它有明显的

危险性。SAX 规范不保证 XML 属性按照属性在被处理的文档中出现的顺序报告它们。这意味着,即使可以亲眼看到特定的属性出现在一个元素的属性列表中

的第二个位置,也不能保证在报告给 startElement() 方法的属性列表中它是第二个出现的属性。所以确实不应该对指定了名称的元素使用基于索引的访问方法。

然而,基于索引的访问仍然有实际用途。例如,它让您可以检查所有的属性,然后得到每一个属性的名称和值。考虑清单6中的

代码,它就是完成这项工作的,这里全部使用了基于索引的访问。

 

清单6. 检查子元素的所有属性

public void startElement (String uri, String localName,
		      String qName, Attributes atts)
  throws SAXException {
	
    if (localName.equals("child")) {
      int numAtts = atts.getLength();
        for (int i=0; i<numAtts; i++) {
          String attName = atts.getQName(index);
	      String value = atts.getValue(index);
	      System.out.println(" * Attribute named " + attName + 
	                  " found, with value '" + value + "'");
        }
    }
  }

好了,这次我真正讲完了 ContentHandler 接口。在下一篇技巧中,我将正式转入 ErrorHandler ,并分析究竟如何用它处理从错误放置的尖括号到缺少属性的各种事情。我还将为您展示一个解析器(由 XMLReader 的一个实例作为代表)如何可以注册多个处理程序。对于那些急于从本文中得到有关错误处理内容的读者,我要说一声抱歉!

在我的下一篇技巧文章中,我将再次在网上与您见面,把您的想法告诉我,正如您从本文可以看到的,读者的意见真的可以

起作用的。

注本原文见http://www.ibm.com/developerworks/cn/xml/x-tiphndl4/

参考:http://gceclub.sun.com.cn/Java_Docs/jdk6/docs/zh/api/org/xml/sax/package-tree.html

[信号与系统]一阶与二阶连续时间系统和离散时间系统 定义:一阶连续时间系统由一阶线性常系数微分方程描述: dy(t)dt+ay(t)=bx(t) \frac{dy(t)}{dt} + a y(t) = b x(t) dtdy(t)​+ay(t)=bx(t)时间常数:时间常数 τ=1a\tau = \frac{1}{a}τ=a1​ 是系统响应速度的衡量指标。时间常数越小,系统响应越快。冲激响应:一阶系统的冲激响应是指数衰减或增长的形式。例如,对于一个单位冲激输入,响应为: h(t)=bae−at h(t) = \frac{b}{a} e^{-at} h(t)= 阅读详情

相关推荐

SAP各模块表清单及逻辑关系介绍

分享韩国同行总结的各模块的表清单及逻辑关系,这对ABAP顾问和各模块业务顾问应该非常有用的 物料主数据 SD与MM PS模块 PP模块 QM模块 CO模块 FI模块

weixin_40672823的博客 9601

ContentHandle和SAX

ContentHandler是Java类包中一个特殊的SAX接口,位于org.xml.sax包中。该接口封装了一些对事件处理的方法,当XML解析器开始解析XML输入文档时,它会遇到某些特殊的事件,比如文档的开头和结束、元素开头和结束、以及元素中的字符数据等事件。当遇到这些事件时,XML解析器会调用ContentHandler接口中相应的方法来响应该事件。ContentHandler接口的方法有以下

shirleynmg的专栏 926

MATLAB数据可视化:pcolor函数从入门到精通(附colormap调色秘籍)

本文深入解析MATLAB中pcolor函数的数据可视化应用,从核心机制、坐标网格指定到常见陷阱规避。重点揭秘colormap调色秘籍,涵盖内置色系选用原则、个性化定制方法及高级渲染技巧,助你创作出信息准确、视觉出色的专业图表,精通从数据到出版级图表的全流程。

kafka6courier的博客 249

无废话SAX:十分钟了解sax基础

Sax 是事件驱动的 xml 简单接口。 要解析一份 xml 文档,而且在解析的过程中当某些事件发生时执行你希望此时执行的代码,就先准备以下三件事情。 l         获取一个 xml 解析器:到 xml.apache.org 免费获取。 l         获取 sax 类:上述的 xerces 解析器已经包括了,记得在 classpath 里包括他们。 l        

坚持,才是力量.老实做人,踏实做事. 1097

嵌入式学习笔记- 关于电容的纹波电流

纹波电流是导致电解电容发热、影响其寿命的关键交流电流成分。它不是一种特殊的电流,而是电路中必然存在的现象。要重视,不能忽视。必须保证电路中的纹波电流 < 电容的额定纹波电流。电容鼓包爆浆,要怀疑是否是纹波电流过大或电容ESR变大所致。希望这个解释能帮助您彻底理解这个概念!二 电容纹波电流与频率的关系在大多数情况下,频率越高,电容所能承受的额定纹波电流值越大。【个人理解:因为频率越低ESR越大,具体见第三节ESR与频率的关系】下面我为您详细解释为什么会这样,以及在实际应用中如何考虑。

qq_35771411的博客 2199

GD32F303实战:用定时器4触发ADC2+DMA,实现10ms精准采样1024点的完整流程

本文详细介绍了在GD32F303微控制器上使用Timer4触发ADC2配合DMA传输,实现10ms精准采样1024点的完整方案。从硬件架构设计、时钟树配置到定时器参数计算,提供了完整的工程实现流程和常见问题排查方法,适用于工业传感器监测等高实时性场景。

weixin_29194693的博客 433

五大handler(系列最核心)

Content Ring Handler for Location(location对应的业务处理)Initialization Handler for nginx worker(初始化)Nginx Rewrite Handler(地址重定向)Nginx Access Handler(鉴权)Nginx Log Handler(日志输出)该项目源码的仓库地址,https协议。该项目源码的仓库地址,ssh协议。该项目在GitHub上的主页。git仓库地址(https)git仓库地址(ssh)

m0_62396648的博客 253

基于Dify1.9知识库流水线模板的思考——图像和表格数据处理

本文探讨了Dify1.9知识库流水线中LLM节点对文档图像/表格增强处理的优化方案。针对当前仅在内容后追加说明的简单做法,提出了结构化标注的改进方法:通过唯一ID和注释块标记图像/表格及其描述,确保内容可精准对齐。文章详细阐述了该方案的解析处理流程、数据结构化表示方法,以及在RAG检索和文档还原中的具体应用。关键经验包括:必须结构化标注非文本内容、LLM增强的必要性、语义向量化处理等。该方案解决了原始方法在内容重排、相似元素区分和检索精度等方面的问题。

roseey的专栏 1445

XML解析之SAX方式

XML解析之SAX方式解析xml文件 SAX解析方式会逐行地去扫描XML文档,当遇到标签时会触发解析处理器,采用事件处理的方式解析XML (Simple API for XML) ,不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。优点是:在读取文档的同时即可对XML进行处理,不必等到文档加载结束,相对快捷。不需要加载进内存,因此不存在占用内存的问题,可以解析超大XML。缺点是:只能用来读取XML中数据,无法进行增删改。 SAX解析可分四个步骤进行: 1、得到xml文

Fisher 2891

管理类联考——逻辑——真题篇——按知识分类——综合推理

29、某部门抽检了肉制品、白酒、乳制品、干果、蔬菜、水产品、饮料等﹖类商品共521种样品,发现其中合格样品515种,不合格样品6种。已知: (1)蔬菜、白酒中有2种不合格样品。 (2)肉制品、白酒、蔬菜、水产品中有5种不合格样品。 (3)蔬菜、乳制品、干果中有3种不合格样品。 根据上述信息,可以得出以下哪项? A. 乳制品中没有不合格样品。 B. 肉制品中没有不合格样品。 C. 蔬菜中没有不合格样品。 D. 白酒中没有不合格样品。 E. 水产品中没有不合格样品。 31~32题基于以下题干: 某中学举行田径运

stqer的博客 2029

TriCore架构-如何将系统刷成HSM

本文介绍了芯片刷写操作流程:首先加载project_Merge.s19文件,进入UCB界面展开BMHD0_ORIG和BMHD1_ORIG。重点说明需要将STAD地址从原始值A0000000修改为0XA00A0000,并详细描述了编辑、更新和写入芯片的步骤。最后提示在HSM刷写过程中如遇错误可能需要输入密码。该操作涉及关键地址修改,需谨慎执行。

xiandang8023的博客 96

SAX之内容处理类

为什么80%的码农都做不了架构师?>>> ...

weixin_34324081的博客 207

干货满满!AI应用架构师分享AI驱动虚拟展示干货

虚拟展示(Virtual Presentation):用数字技术将物理对象/场景转化为可交互的虚拟内容(比如3D文物、虚拟试衣间);AI驱动(AI-Powered):通过AI技术实现实时交互、智能决策、个性化生成,让虚拟内容“活”起来;AI驱动虚拟展示:以用户体验为核心,将“3D渲染+AI理解+实时数据”融合,形成“感知-决策-反馈”的闭环系统。前端交互层是用户直接体验到的部分,再厉害的AI和渲染,只要前端交互烂,用户都会跑。我见过很多团队为了“炫技”做了复杂的AI功能,结果用户不会用。

AI大模型应用之禅 540

Android学习笔记之XML解析(SAX)

SAX是一种占用内存少且解析速度快的解析器,它采用的是事件启动,它不需要解析完整个文档,而是按照内容顺序 看文档某个部分是否符合xml语法,如果符合就触发相应的事件,所谓的事件就是些回调方法(callback),这些方法 定义在ContentHandler中,下面是其主要方法: startDocument:当遇到文档的时候就触发这个事件 调用这个方法 可以在其中做些预处理工作 ...

weixin_30267785的博客 71

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

sax解析dtd_Java教程分享详细了解Javasax解析器

Java教程分享详细了解Javasax解析器,SAX(针对XML的简单API)是基于事件为XML文档的解析器。不像DOM解析器,SAX解析器创建没有解析树。SAX是一个流接口用于XML的,这意味着使用SAX应用接收事件通知有关XML文档被处理的元素,属性,在按顺序每次开始在文档的顶部,并与所述闭合结束根元素。  读取XML文件从上到下,构成一个结构完整的XML文档的标记  令牌以相同的顺序进行处...

weixin_34234983的博客 179

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

技巧: 设置 SAX 解析器

<br />在 Java 中使用 XML 是一个内容相当丰富的主题;可以使用多个 API,而且许多 API 使得使用 XML 简单得如同从文本文档读取行。基于树的 API(如 DOM)展现了一个内存中的 XML 结构,该结构对于 GUI 和编辑器来说是最理想的,基于流的 API(如 SAX)对于只需要获取文档数据的高性能应用程序来说很重要。在本技巧文章系列中,我将从基础知识开始一步步地教您如何在 Java 中使用 XML。同时,您将学习许多甚至连众多专业人士都不知道的诀窍,所以即使您已经具有一些 XML 经

joecheungdishuiya的专栏 983

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SAXP解析XML的笔记

  SAXP 使用streaming 读取xml ,基于事件触发和回调函数处理xml 内容,占用内存小,速度快,适用于1 )仅仅读取但是不改变xml 内容 2 )只处理内容一次,类似于在xml 中查找相关内容。 创建Factory 解析xml 过程。首先需要创建factory ,factory 是用来创建parser 的,包含一些创建parser 的属性。 view source p...

zhugegod的专栏 340

java读取xml 三层嵌套_好程序员Java教程分享详细了解Javasax解析器

好程序员Java教程分享详细了解Javasax解析器,SAX(针对XML的简单API)是基于事件为XML文档的解析器。不像DOM解析器,SAX解析器创建没有解析树。SAX是一个流接口用于XML的,这意味着使用SAX应用接收事件通知有关XML文档被处理的元素,属性,在按顺序每次开始在文档的顶部,并与所述闭合结束根元素。读取XML文件从上到下,构成一个结构完整的XML文档的标记令牌以相同的顺序进行处理...

weixin_32722209的博客 412

python解析XML文件并转存到excel

python解析XML文件并转存到excel 转换前的xml文档信息如下: 处理后的效果如下: python代码如下: import xml.sax from openpyxl import Workbook, load_workbook import os def write_to_excel(two_dimension_list): path = os.path.dirname(os.path.realpath(__file__)) # get the parent path of c

m0_49870013的博客 2971

java中的xml解析以及转化为list

java中的xml解析方法主要有SAX,DOM以及pull方法,今天我尝试的是最为常见的sax方法。 首先,将xml的文件中的主要元素总结为一个类(我的类为AcctDetailRespData),xml文件的内容如下:   281066    1.0    AcctDetailResp    1    00     1 温州移动联盟卡 2984.99

fengYangxiada的专栏 2456

java 字符串xml,解析java中的xml字符串?

how do you parse xml stored in a java string object?Java's XMLReader only parses XML documents from a URI or inputstream. is it not possible to parse from a String containing an xml data?Right now I ...

weixin_31461519的博客 181

解析XML文件___SAX解析

sax解析xml// 得到SAXParserFactory SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); // 得到SAXParser SAXParser saxParser = saxParserFactory.newSAXParser(); // 得到XMLR

tongtongzhao的博客 314

JAVA 的XML编程SAX解析

SAX主要是以串行和层次的方式进行解析,如下是一个很简单的解析例子:1、选择一个要解析的xml文档 <book xmlns="http://www.oreilly.com/javaxml2" xmlns:ora="http://www.oreilly.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schem

TERRY的技术日志 1204

SAX解析XML文档

package com.bird.sax; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; imp...

weixin_30613433的博客 60

java parser xmldocument share with all of us!!

import java.io.*;import org.xml.sax.*;import org.xml.sax.helpers.XMLReaderFactory;import org.apache.xerces.*;public class ParseXMLErrorLog { public void ShowParseResult (String uri) {  System.out.

king_love_love的专栏 1149

解析xml文件遇到奇怪的问题

解析一个xml文件:        00010001 a1.mp3 6,473,098 a1.lrc 2,124  MP3ContentHandler.java:     public class MP3ContentHandler  extends DefaultHandler{ public MP3ContentHan

shiluankuang5671的博客 359
dbrecorder
博客等级 码龄18年 0粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值