java接口中获取XML文档并解析,然后生成新的XML文档并返回(纯代码加详细注释,代码可以直接拷贝并加以修改使用)

    今天写了一个接口,获取XML解析数据,根据生成新的XML并响应回去。完成后试了一下,确实可以用,所以为大家分享一下。本文是针对我需要的XML格式而写的,有很多解析XML的操作都没用到。如果大家有什么问题可以随时留言讨论。
   

    //XML文档的解析和生成操作 
    @RequestMapping(value = "/getIndicators", method = RequestMethod.POST)
    public void getIndicators(HttpServletRequest request, HttpServletResponse response){
        ArrayList<String> list = new ArrayList<String>();
        try {
            //获取HTTP请求的输入流,以HTTP请求输入流建立一个BufferedReader输入流对象
            BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
            String buffer = null;
            
            // 创建字符串对象拼接存放请求到的文档流内容
            StringBuffer xml = new StringBuffer();
            while ((buffer = br.readLine()) != null) {
                // 拼接读取到的请求参数
                xml.append(buffer);
            }
            //创建文档对象和各种需要的流对象
            Document document = null;
            //创建SAXReader解析器对象,用于解析XML输入流对象
            SAXReader reader = new SAXReader();
            //创建字节流对象,并读取字节
            ByteArrayInputStream inputStream = new ByteArrayInputStream(xml.toString().getBytes());
            InputStreamReader ir = new InputStreamReader(inputStream);
            //获取到xml文件,并为文档对象赋值
            document = reader.read(ir);
            
            //获取到XML文档后,根据项目需求,解析XML文件(也就是document对象)
            //首先获取根节点
            Element rootElement = document.getRootElement();
            Iterator iterator = rootElement.elementIterator();
            //遍历根节点,获取里面的子节点(解析XML文档设计方法很多,这里就不详细讲解了,此处写了操作子节点的方法,

            更多方法可以参考  https://blog.csdn.net/m0_37499059/article/details/80505567
            while (iterator.hasNext()){
                Element stu = (Element) iterator.next();
                //获取到根节点的一级子节点
                List<Attribute> attributes = stu.attributes();
                //遍历根节点中的一级子节点,并输出打印一级子节点的属性值
                for (Attribute attribute : attributes) {
                     System.out.println(attribute.getValue());
                }
                //根据一级子节点获取二级子节点,并遍历
                Iterator iterator1 = stu.elementIterator();
                while (iterator1.hasNext()){
                    Element stuChild = (Element) iterator1.next();
                    //输出二级子节点的节点名
                    System.out.println("二级子节点名:" + stuChild.getName());
                    //输出二级子节点的节点值
                    System.out.println("二级子节点值:"+stuChild.getStringValue());
                } 
            }     

            } catch (Exception ex) {
                ex.printStackTrace();
            } finally {
                //生成XML文档并响应
                // 1、创建document对象

                Document document = DocumentHelper.createDocument();
                
                // 2、创建根节点ret
                Element ret = document.addElement("return");
                
                // 3、向ret节点添加version属性
                ret.addAttribute("version", "2.0");
                
                // 4、生成子节点及子节点内容(生成一个status 子节点,并为子节点设置节点值)
                Element status = ret.addElement("status");   
                status.setText("success");
                
                 // 5、生成其他的子节点(生成api一级子节点,然后通过api一级子节点生成value二级子节点并设置节点值)
                Element api = ret.addElement("api");
                Element value = api.addElement("value");
                //为api一级子节点设置name属性并赋值
                api.addAttribute("name", "张三");
                //为value二级子节点设置节点值
                value.setText("26岁");
                       
                // 6、设置生成xml的格式
                OutputFormat format = OutputFormat.createPrettyPrint();
                // 设置编码格式
                format.setEncoding("UTF-8");
                XMLWriter writer;
                
                try {
                    // 为输出流赋值
                    writer = new XMLWriter(response.getOutputStream(), format);
                    //document为通过http返回的xml文件
                    writer.write(document);
                    writer.flush();
                    if (null != writer) {
                        //关闭输出流
                        writer.close();
                    }
                    
                } catch (Exception e) {
                    e.printStackTrace();
                   
                }
        }
    }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值