java中解析复杂xml(XStream简单使用)

编程入门 行业动态 更新时间:2024-10-21 19:37:55

java中解析复杂xml(XStream<a href=https://www.elefans.com/category/jswz/34/1770983.html style=简单使用)"/>

java中解析复杂xml(XStream简单使用)

未来就要来 2017-02-19 18:34

解析xml一般有sax,pull,dom,对与复杂的xml,sax或者pull可能会繁琐了一点,dom应该还行,关于之间的优缺点,网上介绍的很多,在此就不啰嗦了,今天写这个不是用dom去解析复杂的xml,而是用XStream去解析,可以很方便的解析出来。XStream官方介绍(.html),里面用法介绍很全面,下面只是简单备注下,留日后可以快速浏览。


下面是需要解析的xml

创建对应的实体类,Blog,Author和Entry(对应的类在这就不写了,需要说下的是,里面的属性可以没有setter和getter方法,xstram通过反射给里面的属性赋值的),解析上面xml的时候,注意这些实体类必须用空参数构造方法。


将实体转化成xml,调用 xstream.toXML(Object),更多使用请参考XSream官网。




网上另找的不错的例子:


           String xmlStr="<person>"+

                   "<firstName>chen</firstName>" +                    "<lastName>youlong</lastName>" +                    "<telphone>" +                      "<code>137280</code>" +                      "<number>137280968</number>" +                    "</telphone>" +                    "<faxphone>" +                      "<code>20</code>" +                      "<number>020221327</number>" +                    "</faxphone>" +                    "<friends>" +                      "<name>A1</name>" +                      "<name>A2</name>" +                      "<name>A3</name>" +                    "</friends>" +                    "<pets>" +                      "<pet>" +                        "<name>doly</name>" +                        "<age>2</age>" +                      "</pet>" +                      "<pet>" +                        "<name>Ketty</name>" +                        "<age>2</age>" +                      "</pet>" +                    "</pets>" +                  "</person>" ;

1. [代码]1.实体类:PersonBean    

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 import java.util.List; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamImplicit; /**   *@ClassName:PersonBean   *@author: chenyoulong  Email: chen.youlong@payeco   *@date :2012-9-28 下午3:10:47   *@Description:TODO   */ @XStreamAlias ( "person" ) public class PersonBean {      @XStreamAlias ( "firstName" )      private String firstName;      @XStreamAlias ( "lastName" )      private String lastName;            @XStreamAlias ( "telphone" )      private PhoneNumber tel;      @XStreamAlias ( "faxphone" )      private PhoneNumber fax;            //测试一个标签下有多个同名标签      @XStreamAlias ( "friends" )      private Friends friend;            //测试一个标签下循环对象      @XStreamAlias ( "pets" )      private Pets pet;                  //省略setter和getter }

2. [代码]2.实体类:PhoneNumber    

1 2 3 4 5 6 7 8 9 10 @XStreamAlias ( "phoneNumber" )      public  class PhoneNumber{          @XStreamAlias ( "code" )          private int code;          @XStreamAlias ( "number" )          private String number;                        //省略setter和getter                }

3. [代码]3.实体类:Friends(一个标签下有多个同名标签 )    

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 /**       * 用Xstream注解的方式实现:一个标签下有多个同名标签       *@ClassName:Friends       *@author: chenyoulong  Email: chen.youlong@payeco       *@date :2012-9-28 下午4:32:24       *@Description:TODO 5个name 中国,美国,俄罗斯,英国,法国       *       */      public static class Friends{          @XStreamImplicit (itemFieldName= "name" )   //itemFieldName定义重复字段的名称,          /*<friends>                               <friends>              <name>A1</name>                         <String>A1</String>              <name>A2</name>    如果没有,则会变成    =====>       <String>A1</String>              <name>A3</name>                         <String>A1</String>          </friends>                                </friends>        */          private List<String> name;          public List<String> getName() {              return name;          }          public void setName(List<String> name) {              this .name = name;          }      }

4. [代码]4.1实体类:Animal(同一标签下循环对象实体1)    

1 2 3 4 5 6 7 8 9 10 11 12 13 14 //测试同一标签下循环某一对象      public  class Animal{          @XStreamAlias ( "name" )          private String name;          @XStreamAlias ( "age" )          private int age;          public Animal(String name, int age){              this .name=name;              this .age=age;          }                          //省略setter和getter      }     

5. [代码]4.2实体类:Pets(同一标签下循环对象实体2)  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 /**       * 测试同一标签下循环某一对象       *@ClassName:Pets       *@author: chenyoulong  Email: chen.youlong@payeco       *@date :2012-9-28 下午6:26:01       *@Description:TODO       */      public class Pets{          @XStreamImplicit (itemFieldName= "pet" )          private List<Animal> animalList;                    public List<Animal> getAnimalList() {              return animalList;          }          public void setAnimalList(List<Animal> animalList) {              this .animalList = animalList;          }                }

PersonBean person = XmlUtil.toBean(xmlStr, PersonBean.class);
        System.out.println("person=firstname==" + person.getFirstName());
        System.out.println("person==Friends==name1=="
                + person.getFriend().getName().get(0));
        System.out.println("person==Pets==name2=="
                + person.getPet().getAnimalList().get(1).getName());


9. [代码]6.XmlUtil工具类(toxml()和toBean())    跳至[1][2] [3] [4] [5] [6] [7] [8] [9] [全屏预览]

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 /**       * 输出xml和解析xml的工具类       *@ClassName:XmlUtil       *@author: chenyoulong  Email: chen.youlong@payeco       *@date :2012-9-29 上午9:51:28       *@Description:TODO       */      public class XmlUtil{          /**           * java 转换成xml           * @Title: toXml           * @Description: TODO           * @param obj 对象实例           * @return String xml字符串           */          public static String toXml(Object obj){              XStream xstream= new XStream(); //          XStream xstream=new XStream(new DomDriver()); //直接用jaxp dom来解释 //          XStream xstream=new XStream(new DomDriver("utf-8")); //指定编码解析器,直接用jaxp dom来解释                            如果没有这句,xml中的根元素会是<包.类名>;或者说:注解根本就没生效,所以的元素名就是类的属性              xstream.processAnnotations(obj.getClass()); //通过注解方式的,一定要有这句话              return xstream.toXML(obj);          }                    /**           *  将传入xml文本转换成Java对象           * @Title: toBean           * @Description: TODO           * @param xmlStr           * @param cls  xml对应的class类           * @return T   xml对应的class类的实例对象           *           * 调用的方法实例:PersonBean person=XmlUtil.toBean(xmlStr, PersonBean.class);           */          public static <T> T  toBean(String xmlStr,Class<T> cls){              //注意:不是new Xstream(); 否则报错:java.lang.NoClassDefFoundError: org/xmlpull/v1/XmlPullParserFactory              XStream xstream= new XStream( new DomDriver());              xstream.processAnnotations(cls);              T obj=(T)xstream.fromXML(xmlStr);              return obj;                  }         /**           * 写到xml文件中去           * @Title: writeXMLFile           * @Description: TODO           * @param obj 对象           * @param absPath 绝对路径           * @param fileName  文件名           * @return boolean           */                  public static boolean toXMLFile(Object obj, String absPath, String fileName ){              String strXml = toXml(obj);              String filePath = absPath + fileName;              File file = new File(filePath);              if (!file.exists()){                  try {                      file.createNewFile();                  } catch (IOException e) {                      log.error( "创建{" + filePath + "}文件失败!!!" + Strings.getStackTrace(e));                      return false ;                  }              } // end if              OutputStream ous = null ;              try {                  ous = new FileOutputStream(file);                  ous.write(strXml.getBytes());                  ous.flush();              } catch (Exception e1) {                  log.error( "写{" + filePath + "}文件失败!!!" + Strings.getStackTrace(e1));                  return false ;              } finally {                  if (ous != null )                      try {                          ous.close();                      } catch (IOException e) {                          log.error( "写{" + filePath + "}文件关闭输出流异常!!!" + Strings.getStackTrace(e));                      }              }              return true ;          }                    /**           * 从xml文件读取报文           * @Title: toBeanFromFile           * @Description: TODO           * @param absPath 绝对路径           * @param fileName 文件名           * @param cls           * @throws Exception           * @return T           */          public static <T> T  toBeanFromFile(String absPath, String fileName,Class<T> cls) throws Exception{              String filePath = absPath +fileName;              InputStream ins = null ;              try {                  ins = new FileInputStream( new File(filePath ));              } catch (Exception e) {                  throw new Exception( "读{" + filePath + "}文件失败!" , e);              }                            String encode = useEncode(cls);              XStream xstream= new XStream( new DomDriver(encode));              xstream.processAnnotations(cls);              T obj = null ;              try {                  obj = (T)xstream.fromXML(ins);              } catch (Exception e) {                  // TODO Auto-generated catch block                  throw new Exception( "解析{" + filePath + "}文件失败!" ,e);              }              if (ins != null )                  ins.close();              return obj;                  }                }

更多推荐

java中解析复杂xml(XStream简单使用)

本文发布于:2024-02-05 11:59:13,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1745361.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:简单   java   xml   XStream

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!