XML文件的三种解析方式举例讲解-xml文件

XML文件的三种解析方式举例讲解-xml文件

解析xml文档

Dom解析

Sax解析

Pull解析

Dom解析

① 把整个文档先加载到内存中-> Document 所以可以对文档进行修改

② 如果文件比较大 可能会导致内存溢出

编程思路 DocumentBuilderFactory->DocumentBuilder->Document->通过节点获得NodeList->具体的Node

如果想修改 TransformerFactory->Transformer->transform(Souce, result)

public class DomParseTest {

2.

3.@Test

4.public void domParse() throws Exception{

5.//获取DocumentBuilderFactory

6.DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();

7.//获取DocumentBuilder

8.DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder();

9.//通过documentBuilder 解析xml文档获得Document对象

10.Document document = documentBuilder.parse("book.xml");

11.//通过元素的名字可以找到元素的集合

12.NodeList nodeList = document.getElementsByTagName("售价");

13.//nodeList.getLength();

14.for(int i = 0;i<nodeList.getLength();i++){

15.Node node = nodeList.item(i);

16.String content = node.getTextContent();

17.System.out.println(content);

18.}

19.//找到第二个元素

20.Node node = nodeList.item(0);

21.//读出对应节点的文本内容

22.String content = node.getTextContent();

23.System.out.println(content);

24.}

25.

26.@Test

27.public void domModifyxml() throws Exception{

28.DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();

29.DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder();

30.Document document = builder.parse("book.xml");

31.NodeList nodeList = document.getElementsByTagName("售价");

32.Node node = nodeList.item(1);

33.//修改节点的内容

34.node.setTextContent("199.00元");

35.

36.TransformerFactory transformerFactory = TransformerFactory.newInstance();

37.Transformer transformer = transformerFactory.newTransformer();

38.//数据源

39.Source xmlSource = new DOMSource(document);

40.//要输出到的目的地

41.Result outputTarget = new StreamResult("book.xml");

42.transformer.transform(xmlSource, outputTarget);

43.}

44.}

sax

原理 一个元素一个元素解析 解析到一个元素调用相关的方法 startDocument() 文档开始 endDocument 文档结束 startElement 元素开始 endElement元素结束 characters 文本内容

@Test

2.public void saxParser() throws Exception{

3.//获取工厂

4.SAXParserFactory parserFactory = SAXParserFactory.newInstance();

5.SAXParser saxParser = parserFactory.newSAXParser();

6.//获取xmlReader通过这个reader可以试着 ContentHandler

7.XMLReader xmlReader = saxParser.getXMLReader();

8.//给xmlReader设置contentHandler contentHandler是一个接口 里面太多的方法没实现

9.//不去直接实现contenthandler 而是继承它默认的实现 DefaultHandler

10.xmlReader.setContentHandler(new Myhandler());

11.//解析xml文档

12.xmlReader.parse("book.xml");

13.}

14.

15.private class Myhandler extends DefaultHandler{

16.

17.@Override

18.public void startDocument() throws SAXException {

19.System.out.println("文档开始");

20.}

21.

22.@Override

23.public void endDocument() throws SAXException {

24.System.out.println("文档结束");

25.}

26.

27.@Override

28.public void startElement(String uri, String localName, String qName, Attributes attributes)

29.throws SAXException {

30.System.out.println("开始标签<"+qName+">");

31.}

32.

33.@Override

34.public void endElement(String uri, String localName, String qName) throws SAXException {

35.System.out.println("结束标签</"+qName+">");

36.}

37.

38.@Override

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

40.//文本内容

41.String text = new String(ch,start,length);

42.System.out.println("文本内容"+text);

43.}

44.

45.}

调用next方法 解析下一个元素 每调用一次 解析一个元素

public class PullParserTest {

2.

3.@Test

4.public void pullTest() throws Exception {

5.ArrayList<Book> books = null;

6.Book book = null;

7.// 获取工厂

8.XmlPullParserFactory parserFactory = XmlPullParserFactory.newInstance();

9.// 获取到xml的解析器

10.XmlPullParser parser = parserFactory.newPullParser();

11.// 给解析器设置一个输入源

12.// 第一个参数输入流 第二个参数 文档用到的字符编码集

13.parser.setInput(new FileInputStream(new File("book.xml")), "utf-8");

14.// 获取当前事件类型

15.int eventType = parser.getEventType();

16.boolean flag = true;

17.while (eventType != XmlPullParser.END_DOCUMENT && flag) {

18.switch (eventType) {

19.case XmlPullParser.START_TAG:

20.//开始标签

21.//parser.getName 获取当前事件对应的元素名字

22.if("书架".equals(parser.getName())){

23.//创建一个集合

24.books = new ArrayList<>();

25.}else if("书".equals(parser.getName())){

26.//创建一个book 对象

27.book = new Book();

28.}else if("书名".equals(parser.getName())){

29.//给book 对象设置书名的属性

30.book.setTitle(parser.nextText()); //parser.nextText()获取当前节点的下一个文本内容

31.}else if("作者".equals(parser.getName())){

32.//给book 对象设置作者的属性

33.book.setAuthor(parser.nextText());

34.}else if("售价".equals(parser.getName())){

35.//给book 对象设置售价的属性

36.book.setPrice(parser.nextText());

37.}

38.break;

39.case XmlPullParser.END_TAG:

40.//结束标签

41. if("书".equals(parser.getName())){

42.//把book 对象添加到集合中

43. books.add(book);

44. flag = false;

45.}

46.break;

47.}

48.

49.// 调用parser.next方法解析下一个元素 用这个结果来更新eventType 如果解析到文档结束那么就会推出循环

50.// 如果不更新这个eventType 就是死循环

51.eventType = parser.next();

52.}

53.

54.//遍历集合

55.for(Book book1:books){

56.System.out.println(book1);

57.}

58.}

59.

60.}

推荐阅读