1. Dom概述

Dom方式创建XML,应用了标准xml构造器 javax.xml.parsers.DocumentBuilder 来创建 XML 文档,需要导入以下内容

javax.xml.parsers

javax.xml.parsers.DocumentBuilder 

javax.xml.parsers.DocumentBuilderFactory 

javax.xml.parsers.ParserConfigurationException;


javax.xml.transform

javax.xml.transform.TransformerFactory 

javax.xml.transform.Transformer 

javax.xml.transform.dom.DOMSource 

javax.xml.transform.stream.StreamResult 

javax.xml.transform.OutputKeys;

javax.xml.transform.TransformerFactoryConfigurationError;

javax.xml.transform.TransformerConfigurationException;

javax.xml.transform.TransformerException;

org.w3c.dom 

org.w3c.dom.Document;

org.w3c.dom.Element;

org.w3c.dom.Node;

org.w3c.dom.DOMException;

org.w3c.dom.NodeList;

org.xml.sax.SAXException;

sdk源码查看路径(​​google code​​)

创建和解析xml的效果图:

Android 创建与解析XML(二)—— Dom方式_java



2、Dom 创建 XML

Dom,借助 javax.xml.parsers.DocumentBuilder,可以创建 org.w3c.dom.Document 对象。

使用来自 DocumentBuilderFactory 的 DocumentBuilder 对象在 Android 设备上创建与解析 XML 文档。您将使用 XML pull 解析器的扩展来解析 XML 文档。

Code


[java]  ​​view plain​​​ ​​​copy​​​ ​​​print​​​ ​​​?​


1. /** Dom方式,创建 XML  */
2. public String domCreateXML() {
3. null;
4.
5. new Person[3]; // 创建节点Person对象
6. 0] = new Person(1, "sunboy_2050", );
7. 1] = new Person(2, "baidu", "http://www.baidu.com");
8. 2] = new Person(3, "google", "http://www.google.com");
9.
10. try {
11. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
12. DocumentBuilder builder = factory.newDocumentBuilder();
13. Document doc = builder.newDocument();
14.
15. "root");
16. "author", "homer");
17. "date", "2012-04-26");
18. doc.appendChild(eleRoot);
19.
20. int personsLen = persons.length;
21. for(int i=0; i<personsLen; i++) {
22. "person");
23. eleRoot.appendChild(elePerson);
24.
25. "id");
26. "");
27. eleId.appendChild(nodeId);
28. elePerson.appendChild(eleId);
29.
30. "name");
31. Node nodeName = doc.createTextNode(persons[i].getName());
32. eleName.appendChild(nodeName);
33. elePerson.appendChild(eleName);
34.
35. "blog");
36. Node nodeBlog = doc.createTextNode(persons[i].getBlog());
37. eleBlog.appendChild(nodeBlog);
38. elePerson.appendChild(eleBlog);
39. }
40.
41.
42. new Properties();
43. "yes");
44. "xml");
45. "1.0");
46. "utf-8");
47. "xml");
48. "yes");
49.
50. TransformerFactory transformerFactory = TransformerFactory.newInstance();
51. Transformer transformer = transformerFactory.newTransformer();
52. transformer.setOutputProperties(properties);
53.
54. new DOMSource(doc.getDocumentElement());
55. new ByteArrayOutputStream();
56. new StreamResult(output);
57. transformer.transform(domSource, result);
58.
59. xmlWriter = output.toString();
60.
61. catch (ParserConfigurationException e) { // factory.newDocumentBuilder
62. e.printStackTrace();
63. catch (DOMException e) { // doc.createElement
64. e.printStackTrace();
65. catch (TransformerFactoryConfigurationError e) { // TransformerFactory.newInstance
66. e.printStackTrace();
67. catch (TransformerConfigurationException e) { // transformerFactory.newTransformer
68. e.printStackTrace();
69. catch (TransformerException e) { // transformer.transform
70. e.printStackTrace();
71. catch (Exception e) {
72. e.printStackTrace();
73. }
74.
75. savedXML(fileName, xmlWriter.toString());
76.
77. return xmlWriter.toString();
78. }


运行结果:



Android 创建与解析XML(二)—— Dom方式_java_02

3、Dom 解析 XML

Dom方式,解析XML是创建XML的逆过程,主要用到了builder.parse(is)进行解析,然后通过Tag、NodeList、Element、childNotes等得到Element和Node属性或值。

Code


[java]  ​​view plain​​​ ​​​copy​​​ ​​​print​​​ ​​​?​


1. /** Dom方式,解析 XML  */
2. public String domResolveXML() {
3. new StringWriter();
4.
5. InputStream is= readXML(fileName);
6. try {
7. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
8. DocumentBuilder builder = factory.newDocumentBuilder();
9. Document doc = builder.parse(is);
10.
11. doc.getDocumentElement().normalize();
12. "root");
13. 0);
14. "author");
15. "date");
16. "root").append("\t\t");
17. "\t");
18. "\n");
19.
20. "person");
21. int personsLen = nlPerson.getLength();
22. new Person[personsLen];
23. for(int i=0; i<personsLen; i++) {
24. // person节点
25. new Person(); // 创建Person对象
26.
27. "id");
28. 0);
29. 0).getNodeValue();
30. person.setId(Integer.parseInt(id));
31.
32. "name");
33. 0);
34. 0).getNodeValue();
35. person.setName(name);
36.
37. "blog");
38. 0);
39. 0).getNodeValue();
40. person.setBlog(blog);
41.
42. "\n");
43. persons[i] = person;
44. }
45.
46. catch (ParserConfigurationException e) { // factory.newDocumentBuilder
47. e.printStackTrace();
48. catch (SAXException e) { // builder.parse
49. e.printStackTrace();
50. catch (IOException e) { // builder.parse
51. e.printStackTrace();
52. catch (Exception e) {
53. e.printStackTrace();
54. }
55.
56. return xmlWriter.toString();
57. }


运行结果:


Android 创建与解析XML(二)—— Dom方式_java_03

4、Person类

Person类,是创建xml的单位实例,基于Java面向对象定义的一个类


[java]  ​​view plain​​​ ​​​copy​​​ ​​​print​​​ ​​​?​



    1. public class Person {
    2. private int id;
    3. private String name;
    4. private String blog;
    5.
    6. public Person() {
    7. this.id = -1;
    8. this.name = "";
    9. this.blog = "";
    10. }
    11.
    12. public Person(int id, String name, String blog) {
    13. this.id = id;
    14. this.name = name;
    15. this.blog = blog;
    16. }
    17.
    18. public Person(Person person) {
    19. this.id = person.id;
    20. this.name = person.name;
    21. this.blog = person.blog;
    22. }
    23.
    24. public Person getPerson(){
    25. return this;
    26. }
    27.
    28. public void setId(int id) {
    29. this.id = id;
    30. }
    31.
    32. public int getId(){
    33. return this.id;
    34. }
    35.
    36. public void setName(String name) {
    37. this.name = name;
    38. }
    39.
    40. public String getName() {
    41. return this.name;
    42. }
    43.
    44. public void setBlog(String blog) {
    45. this.blog = blog;
    46. }
    47.
    48. public String getBlog() {
    49. return this.blog;
    50. }
    51.
    52. public String toString() {
    53. return "Person \nid = " + id + "\nname = " + name + "\nblog = " + blog + "\n";
    54. }
    55. }