java生成读取xml

种方式生成xml文件
DOM
(Java提供)

SAX(Java提供) ---------用了这个
JDOM
DOM4J(第三方提供)

DOM:

  1. 创建一个DocumentBuilderFactory对象,静态方法newInstance()
  2. 创建一个DocumentBuilder对象,DocumentBuilderFactory实例的newDocumentBuilder()方法
  3. 通过DocumentBuilder对象调用newDocument方法,返回一个Document对象
  4. 通过Document对象调用creatElement方法,创建一个节点元素,返回Element对象 
    通过Element对象的appendChild方法向该元素添加子元素 
    通过Element对象的setAttribute方法,给元素添加属性 
    ……
  5. 通过TransformerFactory的静态方法newInstance(),创建TransformerFactory对象
  6. 通过TransformerFactory的newTransformer(),创建Transformer对象
  7. Transformer对象的setOutputProperty(OutputKeys.INDENT,”yes”)方法可以用来换行(可选)
  8. 调用Transformer的transform()方法将创建的XML转换成Result,Result可通过new File()构建输出文件

/**

    * DOM方式创建xml文件

    * @param file 文件

    * @throws Exception

    */

    publicstaticvoid DOMcreate(File file)throws Exception{

       DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();

       DocumentBuilder db=dbf.newDocumentBuilder();

       Document document=db.newDocument();

       document.setXmlStandalone(true);

       Element root=document.createElement("tb_student");

       for (int i = 0; i < 3; i++) {

           Element student=document.createElement("student");

           Element name=document.createElement("name"),

                    age=document.createElement("age"),

                    grade=document.createElement("grade");

                student.setAttribute("id", i+"");

                name.setTextContent(""+i);

                age.setTextContent(""+i*5);

                grade.setTextContent(""+i*20);

                student.appendChild(name);

                student.appendChild(age);

                student.appendChild(grade);

           root.appendChild(student);

       }

       document.appendChild(root);    

       TransformerFactory tff=TransformerFactory.newInstance();

       Transformertf=tff.newTransformer();

       tf.setOutputProperty(OutputKeys.INDENT, "yes");

       tf.transform(new DOMSource(document), new StreamResult(file));

    }

SAX:

  1. 用ArrayList存储xml所需的对象集合
  2. 通过SAXTransformerFactory的静态方法newInstance()创建一个SAXTransformerFactory对象
  3. 通过SAXTransformerFactory对象的newTransformerHandler()创建一个TransformerHandler对象
  4. 通过TransformerHandler对象的getTransformer()创建一个Transformer对象
  5. Transformer对象的setOutputProperty(OutputKeys.INDENT,”yes”)可以实现换行(可选)
  6. Transformer对象的setOutputProperty(OutputKeys.ENCODING,”编码名称”)可以实现编码格式(可选)
  7. 创建Result对象,并使用TransformerHandler对象的setResult(Result)方法使其与TransformerHandler关联
  8. 使用TransformerHandler对象的进行xml文件内容的编写(遍历ArrayList创建各个节点) 
    startDocument();//开始文档 
    endDocument();//结束文档 
    startElement(String uri,String localName,String qName,Attributes atts);//元素标签开始 
    endElement(String uri,String localName,String qName,Attributes atts);//元素标签结束

    /**

    * SAX方式创建xml文件

    * @param file

    * @throws Exception

    */

    publicstaticvoid SAXcreate(File file)throws Exception {

       //初始化要生成文件的数据

       ArrayList<Student> students=new ArrayList<Student>();

       for (int i = 0; i < 3; i++) {

           Student student=new Student(i,""+i,5*i,10*i);

           students.add(student);

       }

 

       SAXTransformerFactory stf=(SAXTransformerFactory)SAXTransformerFactory.newInstance();

       TransformerHandler handler=stf.newTransformerHandler();

       Transformer tf=handler.getTransformer();

       tf.setOutputProperty(OutputKeys.INDENT, "yes");//标签自动换行

       tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");//编码格式

       StreamResult result=newStreamResult(file);//创建Result对象

       handler.setResult(result);//关联

 

       handler.startDocument();

       handler.startElement("", "", "tb_students", null);//根节点标签

 

       for (Student student : students) {

           AttributesImpl atts=newAttributesImpl();//创建熟悉

           atts.addAttribute("", "", "id", "",student.getId()+"");

           handler.startElement("", "", "student", atts);//元素标签开始

 

           handler.startElement("", "", "name", null);//元素标签开始

           handler.characters(student.getName().toCharArray(), 0, student.getName().length());//元素标签内容

           handler.endElement("", "", "name");//元素标签结束

 

           handler.startElement("", "", "age", null);

           handler.characters((""+student.getAge()).toCharArray(),0, (""+student.getAge()).length());

           handler.endElement("", "", "age");

 

           handler.startElement("", "", "grade", null);

            handler.characters((""+student.getGrade()).toCharArray(), 0,(""+student.getGrade()).toCharArray().length);

           handler.endElement("", "", "grade");

 

           handler.endElement("", "", "student");//元素标签结束

       }

 

       handler.endElement("", "", "tb_students");//结束根节点标签

       handler.endDocument();

    }

实体类student

package entity;

 

publicclassStudent {

 

    privateint id;

    private String name;

    privateint age;

    privateint grade;

 

    public Student() {

       // TODOAuto-generated constructor stub

    }

    public Student(int id, String name, int age, int grade) {

       super();

       this.id = id;

       this.name = name;

       this.age = age;

       this.grade = grade;

    }

    publicint getId() {

       return id;

    }

    publicvoid setId(int id) {

       this.id = id;

    }

    public String getName() {

       return name;

    }

    publicvoid setName(String name) {

       this.name = name;

    }

    publicint getAge() {

       return age;

    }

    publicvoid setAge(int age) {

       this.age = age;

    }

    publicint getGrade() {

       return grade;

    }

    publicvoid setGrade(int grade) {

       this.grade = grade;

    }

 

}

DOM4J:

  1. 通过DocumentHelper的静态方法createDocument创建一个Document对象
  2. 创建节点:Document对象的addElement方法 返回Element对象
  3. 节点添加属性:Element对象的addAttribute方法 
    节点添加内容:Element对象的setTextadd方法
  4. 创建XMLWriter对象 (new) (可使用输出流、OutputFormat作为参数,分别给出输出地址和格式) 
    XMLWriter对象的setEscapeText方法可以设置字符是否转义,默认true(转义)
  5. 调用XMLWriter对象的write方法,Document对象作为参数
  6. 关闭XMLWriter对象,以及相关资源的close操作

    /**

    * DOM4J方式创建xml文件

    * @param file

    * @throws Exception

    */

    publicstaticvoid DOM4Jcreate(File file)throws Exception{

       org.dom4j.Document document=DocumentHelper.createDocument();

       org.dom4j.Element root=document.addElement("rss");

       root.addAttribute("version", "2.0");

       org.dom4j.Element channel=root.addElement("channel");

       org.dom4j.Element title=channel.addElement("title");

       title.setText("新闻国内");

       //...

       XMLWriter writer=new XMLWriter(newFileOutputStream(file),OutputFormat.createPrettyPrint());

       writer.setEscapeText(false);//字符是否转义,默认true

       writer.write(document);

       writer.close();

    }

:此处模拟的是一个”rss”文件的生成部分代码,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用。

JDOM:

  1. 创建Document对象 (new)
  2. 创建Element对象 (new) 并向其中添加属性/内容/子节点
  3. 向Document对象中添加Element节点 addContent/setContent 
    (或者创建Document对象时将Element对象作为参数等)
  4. 创建XMLOutputter对象 (new) 并调用output方法生成xml文档

    /**

    * JDOM方式创建xml文件

    * @param file

    * @throws Exception

    */

    publicstaticvoid JDOMcreate(File file)throws Exception{

       org.jdom2.Document document=new org.jdom2.Document();

       org.jdom2.Element root=neworg.jdom2.Element("rss");

       root.setAttribute("version", "2.0");

       root.addContent(

                new org.jdom2.Element("channel").addContent(

                        new org.jdom2.Element("title").setText("新闻国内")));

       document.setRootElement(root);

       XMLOutputter outputter=new XMLOutputter();

       outputter.setFormat(Format.getPrettyFormat());//设置文本格式

       outputter.output(document, new FileOutputStream(file));

    }

 ===================================================================

生成完之后是读取

====================================================================

android开发里经常会遇到后台传来xml格式的数据,需要我们把它们解析后变成对象或者集合, dom4j是一个JavaXML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、所以我们用dom4j解析xml,把其转化为对象,或者集合,使用之前导入dom4j.jar架包

        1、把下面的xml 转化为person的对象

[html] view plain copy

1.  <resp>  

2.      <name>jack</name>  

3.      <age>21</age>  

4.      <birthday>1990-02-01</birthday>  

5.      <sex>man</sex>  

6.  </resp>  

      2把下面的xml 转化为person集合

[html] view plain copy

1.  <resp>  

2.      <desc>0</desc>  

3.      <depict>ok</depict>  

4.      <content>  

5.          <name>jack</name>  

6.          <age>21</age>  

7.          <birthday>1990-02-01</birthday>  

8.          <sex>man</sex>  

9.      </content>  

10.     <content>  

11.         <name>jack</name>  

12.         <age>21</age>  

13.         <birthday>1990-02-01</birthday>  

14.         <sex>man</sex>  

15.     </content>  

16.     <content>  

17.         <name>jack</name>  

18.         <age>21</age>  

19.         <birthday>1990-02-01</birthday>  

20.         <sex>man</sex>  

21.     </content>  

22. </resp>  

   下面直接贴代码了:

   Person类:


[java]
 view plain copy

1.  public class Person {  

2.    

3.   private String name;  

4.   private String age;  

5.   private String birthday;  

6.   private String sex;  

7.  public String getName() {  

8.      return name;  

9.  }  

10. public void setName(String name) {  

11.     this.name = name;  

12. }  

13. public String getAge() {  

14.     return age;  

15. }  

16. public void setAge(String age) {  

17.     this.age = age;  

18. }  

19. public String getBirthday() {  

20.     return birthday;  

21. }  

22. public void setBirthday(String birthday) {  

23.     this.birthday = birthday;  

24. }  

25. public String getSex() {  

26.     return sex;  

27. }  

28. public void setSex(String sex) {  

29.     this.sex = sex;  

30. }  

31.    




   Dom4jUtil

 


[java]
 view plain copy

1.  import java.io.StringReader;  

2.  import java.util.ArrayList;  

3.  import java.util.HashMap;  

4.  import java.util.Iterator;  

5.  import java.util.List;  

6.  import java.util.Map;  

7.    

8.  import org.dom4j.Document;  

9.  import org.dom4j.DocumentException;  

10. import org.dom4j.DocumentHelper;  

11. import org.dom4j.Element;  

12. import org.dom4j.io.SAXReader;  

13. import org.xml.sax.InputSource;  

14.   

15. public class Dom4jUtil {  

16.   

17.     /** 

18.      * @param args 

19.      * @throws DocumentException 

20.      */  

21.     public static void main(String[] args) throws DocumentException {  

22.         // TODO Auto-generated method stub  

23.   

24.         String xml = "<resp>" + "<name>jack</name>" + "<age>21</age>"  

25.                 + "<birthday>1990-02-01</birthday>" + "<sex>man</sex>"  

26.                 + "</resp>";  

27.         Person student = getPerson(xml);  

28.         System.out.println(student.getName() + "|" + student.getAge() + "|"  

29.                 + student.getBirthday() + "|" + student.getSex());  

30.         System.out.println("person对象");  

31.         String modelXMl = "<name>jack</name>" + "<age>21</age>"  

32.                 + "<birthday>1990-02-01</birthday>" + "<sex>man</sex>";  

33.         String xmlList = "<resp>" + "<desc>0</desc>" + "<depict>ok</depict>"  

34.                 + "<content>" + modelXMl + "</content>" + "<content>"  

35.                 + modelXMl + "</content>" + "<content>" + modelXMl  

36.                 + "</content>" + "</resp>";  

37.         System.out.println("person集合列表");  

38.         List<Person> list = getPersonList(xmlList);  

39.         for (Person person : list) {  

40.             System.out.println(person.getName() + "|" + person.getAge() + "|"  

41.                     + person.getBirthday() + "|" + person.getSex());  

42.         }  

43.     }  

44.   

45.     /** 

46.      * xml格式转化为person对象 

47.      *  

48.      * @param xml 

49.      * @return 

50.      */  

51.     public static Person getPerson(String xml) {  

52.         Person person = null;  

53.         InputSource in = new InputSource(new StringReader(xml));  

54.         in.setEncoding("UTF-8");  

55.         SAXReader reader = new SAXReader();  

56.         Document document;  

57.         try {  

58.             document = reader.read(in);  

59.             Element root = document.getRootElement();  

60.             person = (Person) XmlUtil.fromXmlToBean(root, Person.class);  

61.   

62.         } catch (Exception e) {  

63.             // TODO Auto-generated catch block  

64.             e.printStackTrace();  

65.             System.out.println("数据解析错误");  

66.   

67.         }  

68.         return person;  

69.     }  

70.   

71.     /** 

72.      * xml转化为person集合 

73.      *  

74.      * @param xml 

75.      * @return 

76.      */  

77.     public static List<Person> getPersonList(String xml) {  

78.   

79.         Document doc = null;  

80.         List<Person> list = new ArrayList<Person>();  

81.         try {  

82.   

83.             // 读取并解析XML文档  

84.   

85.             // SAXReader就是一个管道,用一个流的方式,把xml文件读出来  

86.   

87.             // SAXReader reader = new SAXReader(); //User.hbm.xml表示你要解析的xml文档  

88.   

89.             // Document document = reader.read(new File("User.hbm.xml"));  

90.   

91.             // 下面的是通过解析xml字符串的  

92.   

93.             doc = DocumentHelper.parseText(xml); // 将字符串转为XML  

94.   

95.             Element rootElt = doc.getRootElement(); // 获取根节点  

96.   

97.             System.out.println("根节点:" + rootElt.getName()); // 拿到根节点的名称  

98.   

99.             String returnCode = rootElt.elementTextTrim("desc");  

100.             if (!"0".equals(returnCode)) {  

101.                 System.out.println("后台数据返回有问题");  

102.                 return null;  

103.             }  

104.   

105.             Iterator<Element> it = rootElt.elementIterator("content");// 获取根节点下所有content  

106.             while (it.hasNext()) {  

107.                 Element elementGroupService = (Element) it.next();  

108.                 Person baseBean = (Person) XmlUtil.fromXmlToBean(  

109.                         elementGroupService, Person.class);  

110.                 list.add(baseBean);  

111.             }  

112.   

113.         } catch (Exception e) {  

114.             // TODO: handle exception  

115.             System.out.println("数据解析错误");  

116.         }  

117.   

118.         return list;  

119.     }  

120.   

121. }  

     XmlUtil类:

[java] view plain copy

1.  import java.lang.reflect.Field;  

2.  import java.util.Date;  

3.    

4.  import org.dom4j.Element;  

5.    

6.  public class XmlUtil  

7.  {  

8.      /** 

9.       * json 数据转换对象 

10.      *  

11.      * @param Element 

12.      *            要转换的Element数据 

13.      * @param pojo 

14.      *            要转换的目标对象类型 

15.      * @return 转换的目标对象 

16.      * @throws Exception 

17.      *             转换失败 

18.      */  

19.     @SuppressWarnings("rawtypes")  

20.     public static Object fromXmlToBean(Element rootElt, Class pojo) throws Exception  

21.     {  

22.         // 首先得到pojo所定义的字段  

23.         Field[] fields = pojo.getDeclaredFields();  

24.         // 根据传入的Class动态生成pojo对象  

25.         Object obj = pojo.newInstance();  

26.         for (Field field : fields)  

27.         {  

28.             // 设置字段可访问(必须,否则报错)  

29.             field.setAccessible(true);  

30.             // 得到字段的属性名  

31.             String name = field.getName();  

32.             // 这一段的作用是如果字段在Element中不存在会抛出异常,如果出异常,则跳过。  

33.             try  

34.             {  

35.                 rootElt.elementTextTrim(name);  

36.             }  

37.             catch (Exception ex)  

38.             {  

39.                 continue;  

40.             }  

41.             if (rootElt.elementTextTrim(name) != null && !"".equals(rootElt.elementTextTrim(name)))  

42.             {  

43.                 // 根据字段的类型将值转化为相应的类型,并设置到生成的对象中。  

44.                 if (field.getType().equals(Long.class) || field.getType().equals(long.class))  

45.                 {  

46.                     field.set(obj, Long.parseLong(rootElt.elementTextTrim(name)));  

47.                 }  

48.                 else if (field.getType().equals(String.class))  

49.                 {  

50.                     field.set(obj, rootElt.elementTextTrim(name));  

51.                 }  

52.                 else if (field.getType().equals(Double.class) || field.getType().equals(double.class))  

53.                 {  

54.                     field.set(obj, Double.parseDouble(rootElt.elementTextTrim(name)));  

55.                 }  

56.                 else if (field.getType().equals(Integer.class) || field.getType().equals(int.class))  

57.                 {  

58.                     field.set(obj, Integer.parseInt(rootElt.elementTextTrim(name)));  

59.                 }  

60.                 else if (field.getType().equals(java.util.Date.class))  

61.                 {  

62.                     field.set(obj, Date.parse(rootElt.elementTextTrim(name)));  

63.                 }  

64.                 else  

65.                 {  

66.                     continue;  

67.                 }  

68.             }  

69.         }  

70.         return obj;  

71.     }  

72. }  

======================================================================

到这里希望对java新手有用


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值