PYTHON XML解析-SAX解析

PYTHON XML解析-SAX解析,第1张

SAX是一种基于事件驱动的API,利用SAX解析XML牵扯到两个部分,解析器和事件处理器。其中解析器负责读取XML文档,并向事件处理器发送事件;事件处理器负责做出响应,对处理的XML数据进行处理。

常用情况:

1.对大型文件进行处理

2.只需要文件的部分内容,或者只需要从文件中得到特定信息

3.想建立自己的对象模型

文档启动的时候调用

文档解析结束后调用

遇到XML开始标签时调用,name是标签的名字,attrs是标签的属性值字典,例如<user name='MoonMonster'>,那么便可使用attrs['name']来获取name的值。

遇到XML结束标签时调用,name是结束标签的名称

包含在标签中的值,content就是被包含的值

如果只是需要从文档中把所有的数据都读取出来,那么直接从character()函数中保存content数据即可,然后在endElement()函数中存储。需要注意的是,这种写法需要将没有直接内容的标签排除掉,例如movie标签,不然会出现没有数据的标签出现数据的情况。还有一点需要注意,如果标签中的数据换行了,会带来很多意料之外的情况,像下面这种。

或者参照网上其他人的写法:

在这个例子中,使用了self.CurrentData来保存当前标签,但有一个坑的地方是,在endElement函数中,无法获取到像movie这种标签的结束标签。

我们上一节探究了ClassPathResource通过输入Path构造出一个Resource对象,我们这一节继续学习XmlBeanFactory如何解析Resource,将Resource转化成一个Document。

,我们可以看到XmlBeanDefinitionReader上层是BeanDefinitionReader接口,EnvironmentCapable接口已经父类AbstractBeanDefinitionReader。

我们可以看到上面的步骤分为五步。1:对source进行encode封装,考虑到可能需要编码。2:通过sax读取xml文件方式构建一个inputSource。3:getValidationModeForResource获取xml的验证模式。4:加载xml文件,获得对应的Document。5:通过Document注册BeanDefinition。至此就完成了一个xml文件到document,document到BeanDefinition的转换,这里转换使用的sax解析xml文件的方法,有兴趣的可以debug进去看看。

<?xml version="1.0" encoding="UTF-8"?>

<emps>

<emp id="1">

<name>zhangsan</name>

<sex>man</sex>

</emp>

<emp id="2">

<name>lisi</name>

<sex>women</sex>

</emp>

</emps>

命名为example.xml

在本例中我们将读取元素<emp>的属性id=1和id=2,代码如下:

import javax.xml.parsers.SAXParser

import javax.xml.parsers.SAXParserFactory

import org.xml.sax.Attributes

import org.xml.sax.helpers.DefaultHandler

public class SAXParserTest extends DefaultHandler{

public SAXParserTest() {

super()

}

public void startElement(String uri,String localName,String qName,Attributes attr){

if(attr.getLength()>0){

for(int i = 0i<attr.getLength()i++){

System.out.println(attr.getQName(i)+" = "+attr.getValue(i))

}

}

}

public static void main(String[] args){

try{

//实例化用于分析的工厂

SAXParserFactory factory = SAXParserFactory.newInstance()

//实例化分析类

SAXParser parser = factory.newSAXParser()

SAXParserTest handler = new SAXParserTest()

parser.parse("example.xml",handler)

}catch(Exception e){

System.out.println(e.toString())

}

}

}

二、获取元素块名字属性值

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl"?>

<property>

<name>search.response.default.numrows</name>

<value>10</value>

<description>

The default number of rows to return if none is specified.

</description>

</property>

<property>

<name>searcher.response.maxage</name>

<value>86400</value>

<description>

The maxage of a response in seconds. Used in caching headers.

</description>

</property>

</configuration>

命名为nutch-default.xml

在本例中我们将读取<name>和<value>所表示的值,即<name>=<value>,代码如下:

import javax.xml.parsers.SAXParser

import javax.xml.parsers.SAXParserFactory

import org.xml.sax.Attributes

import org.xml.sax.helpers.DefaultHandler

import org.xml.sax.SAXException

import java.util.Properties

public class SAXParserTest2 extends DefaultHandler{

private Properties props //用于存放名字属性对(key-value)

private String currentName//当前扫描到的键值

private StringBuffer currentValue = new StringBuffer() //当前名字对应的值

private String Name,Value//键值对

public SAXParserTest2(){

super()

this.props=new Properties()

}

public void startElement(String uri,String localName,String qName,Attributes attr){

currentValue.delete(0,currentValue.length())

this.currentName=qName

}

//碰到节点开始和结束之间的字符<element>***</element>

public void characters(char[] ch,int start,int length) throws SAXException{

currentValue.append(ch,start,length)

}

//碰到节点结束</element>

public void endElement(String uri,String localName,String qName){

String name=currentName,value=currentValue.toString().trim()

if(name!=""&&value!="")

System.out.println(name+"="+value)

if(name=="name")

Name=value

if(name=="value")

Value=value

if(qName=="property")

props.put(Name,Value)

this.currentName=""

currentValue.delete(0,currentValue.length())

}

public String getElementValue(String elementName){

//elementValue:对应于elementName的节点的属性值

String elementValue=null

elementValue=props.getProperty(elementName)

return elementValue

}

public static void main(String[] args){

try{

SAXParserFactory factory = SAXParserFactory.newInstance()

SAXParser parser = factory.newSAXParser()

SAXParserTest2 handler = new SAXParserTest2()

parser.parse("nutch-default.xml",handler) System.out.println(handler.getElementValue("searcher.response.maxage "))

}catch(Exception e){

System.out.println(e.toString())

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11591184.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存