天天看点

Xml之Pull解析

1小猫(标签中不带属性信息)

1

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

2

- <cats>      

3

- <cat>      

4

 <id>1</id>       

5

 <name>波斯猫</name>       

6

 </cat>      

7

- <cat>      

8

 <id>2</id>       

9

 <name>机器猫</name>       

10

 </cat>      

11

- <cat>      

12

 <id>3</id>       

13

 <name>越野猫</name>       

14

 </cat>      

15

- <cat>      

16

 <id>4</id>       

17

 <name>装甲猫</name>       

18

 </cat>      

19

- <cat>      

20

 <id>5</id>       

21

 <name>超音速猫</name>       

22

 </cat>      

23

 </cats>      

代码

1

2

/**用Pull解析,解析cat.xml      

3

* @author Administrator      

4

*      

5

*/      

6

public class Demo01PullCat {      

7

8

public static void main(String[] args) throws Exception {      

9

//1.获取解析器的工厂      

10

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();      

11

//2.利用工厂对象获取解析器      

12

XmlPullParser parser = factory.newPullParser();      

13

//3.设置要解析的数据源      

14

parser.setInput(new FileReader("cat.xml"));      

15

//4.首次获取事件码      

16

int eventType = parser.getEventType();//获取到0(文档开始事件)      

17

ArrayList<Cat> list = null;      

18

Cat cat = null;      

19

while(eventType != XmlPullParser.END_DOCUMENT){//在到达文档结束标签</cats>之前,一直循环      

20

//获取当前正在解析的标签:      

21

String tag = parser.getName();      

22

switch (eventType) {      

23

case XmlPullParser.START_DOCUMENT://类似于SAX解析的startDocument()      

24

list = new ArrayList<Cat>();      

25

break;      

26

case XmlPullParser.START_TAG://类似于SAX解析的startElement()      

27

if("cat".equals(tag)){      

28

cat = new Cat();      

29

}else if("id".equals(tag)){      

30

cat.setId(parser.nextText());//获取对象中的一个子标签里面的文本内容!!!!!      

31

}else if("name".equals(tag)){      

32

cat.setName(parser.nextText());      

33

}      

34

break;      

35

case XmlPullParser.END_TAG://类似于SAX解析的endElement()      

36

if("cat".equals(tag)){//如果遇到了对象结束标签</cat>,说明cat对象属性已经组装完毕,可以加入list      

37

list.add(cat);      

38

}      

39

break;      

40

default:      

41

break;      

42

}      

43

//千万别忘了:最后要      

44

eventType = parser.next();//获取下一次的事件类型,否则会陷入死循环.      

45

}      

46

//while循环结束了      

47

for(Cat c:list){      

48

System.out.println(c);      

49

}      

50

}      

51

52

}      

1

public class Cat {      

2

private String id;      

3

private String name;      

4

public String getId() {      

5

return id;      

6

}      

7

public void setId(String id) {      

8

this.id = id;      

9

}      

10

public String getName() {      

11

return name;      

12

}      

13

public void setName(String name) {      

14

this.name = name;      

15

}      

16

@Override      

17

public String toString() {      

18

return "Cat [id=" + id + ", name=" + name + "]";      

19

}      

20

21

}      

2第二只小猫咪(标签中带属性信息)

1

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

2

- <cats>      

3

- <cat age="1">      

4

 <id>1</id>       

5

 <name>波斯猫</name>       

6

 </cat>      

7

- <cat age="2">      

8

 <id>2</id>       

9

 <name>雪地猫</name>       

10

 </cat>      

11

- <cat age="3">      

12

 <id>3</id>       

13

 <name>越野猫</name>       

14

 </cat>      

15

 </cats>      

代码

1

/**用Pull解析,解析cat02.xml      

2

* @author Administrator      

3

*      

4

*/      

5

public class Demo01PullCat {      

6

7

public static void main(String[] args) throws Exception {      

8

//1.获取解析器的工厂      

9

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();      

10

//2.利用工厂对象获取解析器      

11

XmlPullParser parser = factory.newPullParser();      

12

//3.设置要解析的数据源      

13

parser.setInput(new FileReader("cat02.xml"));      

14

//4.首次获取事件码      

15

int eventType = parser.getEventType();//获取到0(文档开始事件)      

16

ArrayList<Cat> list = null;      

17

Cat cat = null;      

18

while(eventType != XmlPullParser.END_DOCUMENT){//在到达文档结束标签</cats>之前,一直循环      

19

//获取当前正在解析的标签:      

20

String tag = parser.getName();      

21

switch (eventType) {      

22

case XmlPullParser.START_DOCUMENT://类似于SAX解析的startDocument()      

23

list = new ArrayList<Cat>();      

24

break;      

25

case XmlPullParser.START_TAG://类似于SAX解析的startElement()      

26

if("cat".equals(tag)){      

27

cat = new Cat();      

28

//解析<cat age="22" >里面的age属性      

29

String value = parser.getAttributeValue(0);//获取当前标签里面的0下标的属性      

30

cat.setAge(Integer.parseInt(value));      

31

//                  int attributeCount = parser.getAttributeCount();//获取当前标签有多少个属性      

32

//                  String name = parser.getAttributeName(index);//获取指定下标的属性的名字      

33

//                  String attributeValue = parser.getAttributeValue(null, "age");      

34

//第一个参数固定传null,      

35

//第二个参数传属性名,该方法可以获取该属性的值      

36

}else if("id".equals(tag)){      

37

cat.setId(parser.nextText());//获取对象中的一个子标签里面的文本内容!!!!!      

38

}else if("name".equals(tag)){      

39

cat.setName(parser.nextText());      

40

}      

41

break;      

42

case XmlPullParser.END_TAG://类似于SAX解析的endElement()      

43

if("cat".equals(tag)){//如果遇到了对象结束标签</cat>,说明cat对象属性已经组装完毕,可以加入list      

44

list.add(cat);      

45

}      

46

break;      

47

default:      

48

break;      

49

}      

50

//千万别忘了:最后要      

51

eventType = parser.next();//获取下一次的事件类型,否则会陷入死循环.      

52

}      

53

//while循环结束了      

54

for(Cat c:list){      

55

System.out.println(c);      

56

}      

57

}      

58

59

}      

3月份(单行属性解析)

1

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

2

- <year>      

3

 <month id="1" shop="myshop" price="8000.00">1</month>       

4

 <month id="2" shop="myshop" price="9000.00">2</month>       

5

 <month id="3" shop="myshop" price="7000.00">3</month>       

6

 <month id="4" shop="myshop" price="8000.00">4</month>       

7

 <month id="5" shop="myshop" price="7800.00">5</month>       

8

 <month id="6" shop="myshop" price="7800.00">6</month>       

9

 <month id="7" shop="myshop" price="7900.00">7</month>       

10

 <month id="8" shop="myshop" price="7900.00">8</month>       

11

 <month id="9" shop="myshop" price="7000.00">9</month>       

12

 <month id="10" shop="myshop" price="7800.00">10</month>       

13

 <month id="11" shop="myshop" price="11000.00">11</month>       

14

 <month id="12" shop="myshop" price="4500.00">12</month>       

15

 </year>      

代码 1

/**用pull解析单行元素(对象根标签中没有子标签)      

2

* @author Administrator      

3

*      

4

*/      

5

public class Demo03Month {      

6

public static void main(String[] args) throws Exception {      

7

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();      

8

XmlPullParser parser = factory.newPullParser();      

9

parser.setInput(new FileReader("month.xml"));      

10

int eventType = parser.getEventType();      

11

List<Month> list = null;      

12

Month month = null;      

13

outer:      

14

while(eventType != XmlPullParser.END_DOCUMENT){      

15

String tag = parser.getName();      

16

switch (eventType) {      

17

case XmlPullParser.START_DOCUMENT://遇到文档开始标签,会自动执行,不用判断tag      

18

list = new ArrayList<Month>();      

19

break;      

20

case XmlPullParser.START_TAG:      

21

if("month".equals(tag)){      

22

month = new Month();      

23

String idValue = parser.getAttributeValue(0);      

24

String shopValue = parser.getAttributeValue(1);      

25

String priceValue = parser.getAttributeValue(2);      

26

month.setId(idValue);      

27

month.setShop(shopValue);      

28

month.setPrice(Double.parseDouble(priceValue));      

29

}      

30

break;      

31

case XmlPullParser.END_TAG:      

32

if("month".equals(tag)){      

33

list.add(month);      

34

if("5".equals(month.getMonthValue())){//只想获取前5个月的数据,装入list      

35

break outer;      

36

}      

37

}      

38

break;      

39

case XmlPullParser.TEXT://处理单行对象的文本节点的分支      

40

String text = parser.getText();//注意不是nextText()!      

41

text = text.trim();//去掉首尾空白      

42

if(text.length() != 0){//如果文本是有内容的      

43

month.setMonthValue(text);      

44

}      

45

break;      

46

47

default:      

48

break;      

49

}      

50

eventType = parser.next();      

51

}//while结束      

52

for(Month m:list){      

53

System.out.println(m);      

54

}      

55

}      

56

}      

1

public class Month {      

2

//<month id="1" shop="myshop" price="8000.00">1</month>      

3

private String id;      

4

private String shop;      

5

private double price;      

6

private String monthValue;//自己随便定义的名字,用于对应"1"文本节点      

7

@Override      

8

public String toString() {      

9

return "Month [id=" + id + ", shop=" + shop + ", price=" + price + ", monthValue=" + monthValue + "]";      

10

}      

11

public String getId() {      

12

return id;      

13

}      

14

public void setId(String id) {      

15

this.id = id;      

16

}      

17

public String getShop() {      

18

return shop;      

19

}      

20

public void setShop(String shop) {      

21

this.shop = shop;      

22

}      

23

public double getPrice() {      

24

return price;      

25

}      

26

public void setPrice(double price) {      

27

this.price = price;      

28

}      

29

public String getMonthValue() {      

30

return monthValue;      

31

}      

32

public void setMonthValue(String monthValue) {      

33

this.monthValue = monthValue;      

34

}      

35

36

}