加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XML(二)之java解析xml

发布时间:2020-12-15 23:52:03 所属栏目:百科 来源:网络整理
导读:XML的解析 1.常用的XML解析方式:DOM和SAX a)DOM:Document ObjectModel,文档对象模型,非常适合增删改查(CRUD) 是W3C推荐的使用的解析方式 b)SAX:Simple APIfor XML:只能进行查询操作,节省内存。非官方标准 2.常用的解析开发包:JAXP,Dom4j,JDom 3.


XML的解析

1.常用的XML解析方式:DOM和SAX

a)DOM:Document ObjectModel,文档对象模型,非常适合增删改查(CRUD)

是W3C推荐的使用的解析方式

b)SAX:Simple APIfor XML:只能进行查询操作,节省内存。非官方标准

2.常用的解析开发包:JAXP,Dom4j,JDom

3.无论是何种解析方式,首先是你先得到Document对象,然后得到Elment对象,一般Element对象是通过Document对象来获得的。SAX例外

4.要严格区分XML文档树中的根结点与根元素结点:

a) 根结点(Document)代表的是XML文档本身,是我们解析XML文档的入口

b) 而根元素结点则表示XML文档的根元素,它对应于XML文档的Root。

JAXP解析

1.JAXP(Java API forXML Parsing):SUN推出的实现,能实现DOM和SAX方式解析XML.。

2.JAXP的API都在JavaSe中,

a)org.w3c.dom:提供DOM方式解析XML的标准接口

b)org.xml.sax:提供SAX方式解析XML的标准接口

c)javax.xml:提供了解析XML文档的类

JAXP进行DOM解析

1.对于XML应用开发来说,DOM就是一个对象化的XML数据接口,一个与语言无关,与平台无关的标准接口规范。

2.一切皆节点即整个XML文档的每个XMl的结构都是节点,XML文档本身也是一个节点,节点包括XML文档,属性(Attr),元素(Element),CharacterData节点的子类文本(Text)节点和注释节点。DOM就是一个树形结构,如下图:


3.XML文件读入的方式:

//获得DocumentBuilderFactory解析器工厂对象

DocumentBuilderFactory factory=newDocumentBuilderFactory();

//获得DocumentBuilder解析器对象

DocumentBuilder builder=factory.newDocumentBuilder();

//获得XML的整个文档对象

Document document=builder.parse(@xml文档);

注:@XMl文档可以是字符串,可以是File对象,URL对象,InputStream对象

4.一个XML文档里可能有很多相同名字节点,通过Documen对象的getElementTagName()方法得到NodeList对象,再通过NodeList的item(index)选择你要操作第index个元素节点。item(index)方法返回的是节点对象,这个节点对象如果含有元素,就可以对元素进行增删改查操作。Document对象常见方法如下

5.要想获得具体的节点,先得到Node对象,再强制转换为具体的节点对象。

比如我要操作Element节点,首先将Node强制转换为Element,再通过Element节点来操作元素里面的属性和设置文本内容。

例如:Element ele=(Element)node;

6.元素对象(Element)可以对属性进行增删改查。

6.将XMl写入到xml文档:

//将设置完的内容保存到xml文件中

TransformerFactorytransfactory=TransformerFactory.newInstance();

Transformertrans=transfactory.newTransformer();

trans.transform(newDOMSource(doc),new StreamResult("temptest.xml"));

SAX解析

1.SAX(Simple APIs for XML),面向XML的简单APIs ,SAX使用的观察者模式中的设计模式(类似于GUI中事件)。

2.通过读取器读取XMl文档,当读到了文档的某一部分是(文档的开是,元素的开始,,文本,元素的结束,文档的结束),都会调用事件处理器的对应方法,读到的数据,以参数的形式传递给对应的方法。

3.SAX的结构原理图如下:


4.SAX的基本创建过程:

//获得SAX的解析工厂

SAXParserFactory factory=SAXParserFactory.newInstance();

//获得SAX解析器

SAXParser parser=factory.newSAXParser();

//得到XML的读取流

XMLReader reader=parser.getXMLReader();

//添加事件处理机制

reader.setContentHandler(new DefaultHandler(){

//文档每个元素的开始处

@Override

public void startElement(String uri,String localName,

String qName,Attributes attributes)throws SAXException {

System.out.println("元素开始处:"+qName);

}

//每个元素之间的内容

@Override

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

throws SAXException {

System.out.println("文本内容:"+new String(ch,start,length));

}

//文档每个元素的结束

@Override

public void endElement(String uri,String qName)

throws SAXException {

System.out.println(qName);

}

});

//要解析的xml文档

reader.parse("src//exam.xml");

5.使用SAX解析的好处:使用DOM解析XML时,首先将XML文档加载到内存当中,然后可以通过随机的方式访问内存中的DOM树;SAX是基于事件而且是顺序执行的,一旦经过了某个元素,我们就没有办法再去访问它了,SAX不必事先将整个XML文档加载到内存当中,因此它占据内存要比DOM小,对于大型的XML文档来说,通常会使用SAX而不是DOM进行解析。

Dom4j解析

1.它兼具了dom和sax的优点。查询速度快,增删改速度快。具有方法链编程风格(method chain style)

2.XML文档的基本创建过程:

//获得Document对象

SAXReader reader=newSAXReader();

Documentdocument=reader.read("stu.xml");

//通过Document对象获得根元素

Element rootElement=document.getRootElement();

3.通过元素对象(包括根元素)来获得它下面的子元素的操作:

a)获得该元素下第一个子元素:element();

b)返回该元素下面全部的子元素,该方法返回的是一个List集合,我们可以通过List容器的增删改查方法来对元素进行操作,也可以使用List的Iterator来遍历List容器中所有的Elment对象:elements();

c)返回该元素下所有指定的子元素:elements(String name).

4.通过元素对象来获得它属性的操作方法:

a)添加指定的属性,并给属性指定对应的值:addAttrbute(String name,String value);

b)元素所包含的属性的数量,返回的是int类型:attrbuteCount();

c)返回指定的属性的属性值,返回的是String类型:attrbuteValue(String name);

d)获得元素中所有的属性集合,返回的是List类型:attrbutes()

5.通过元素来对元素的文本内容今昔操作:

a)给元素添加文本内容:addText();

b)获得元素的文本内容:getText();

c)获得指定元素的文本内容:elementText(String tagname);

6.创建一个XML文档,元素,属性,就需要使用DocumentHelp对象了:

a)创建一个指定的根元素的XML文档对象,返回的是Document对象:createDocument(Element rootElement)

b)创建一个给定的字符串的XML文本内容,将会返回新的Document对象:

Document parseText(String text)

c)创建一个指定名称的新元素,返回的是Element对象:createElement();

d)创建一个指定的元素,属性名,属性值的属性(Attrbute)对象:

createAttribute(Element owner,QName qname,String value);

7.将XML文档或者Element元素对象变成字符串:

asXML()方法:通过Document对象或者Element对象的引用,调用该方法。该Document或者是Element将会以字符串的表现形式表现。

8.如何将增删改后的XML文档重新保存呢?

OutputStream out=newFileOutputStream(path);

OutputFormatformat=OutputFormat.createPrettyPrint();

XMLWriterwriter=new XMLWriter(out,format);

writer.write(doc);

writer.close();

这里的OutputFormat对象注意一下两个静态方法:

a)createCompactFormat():保存完后的XML文档,是没有格式的,没有空格和换行,该方法是默认的创建方式,一般用在网页传输数据时,节省数据内存。

b)createPrettyPrint():保存完后的XML文档,具有格式美好的,有空格,有换行,但占用内存比较大,一般不用于网络之间的传输。

c)setEncoding(String encoding):设置XML文档的编码格式

9.Dom4j的XPath解析:是通过特殊的符号直接定位到我想要找的内容:

如:Node node = document.selectSingleNode(String xpath);

xpath就是定义的规则,找到后获得Node对象,可以强转成Element对象,再通过元素对象可以进行下一步的增删改查动作。

a)selectSingleNode(String xpath)方法:通过Xpath规则,来获得元素节点对象。

b)valueof(String xpath):通过Xpath规则,来获得相应类型的属性值

例如使用的过程如下:

SAXReaderreader=new SAXReader();

Document document = reader.read(“demo.xml”);

//省去了根元素的获取,直接通过Xpath规则的属性规则获得指定的元素节点

Node node =document.selectSingleNode("//student[@examid=123']");

//Node对象强制转换成Element对象

Element e = (Element)node;

//获得该Element对象的另一个属性值:

int value=valueOf(“@cardid”);

//获得该元素下的子元素

Elementchild=e.element(“name”);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读