JAVA解析XML格式字符串「建议收藏」

JAVA解析XML格式字符串「建议收藏」importjava.io.IOException;importjava.io.StringReader;importjava.util.List;importorg.jdom.Document;importorg.jdom.Element;importorg.jdom.JDOMException;importorg.jdom.Namespace;im

大家好,又见面了,我是你们的朋友全栈君。

这里写到两种xml解析方法。分别针对字符串类型的xml和文件类型的xml。

第一种:对xml字符串进行解析

import java.io.IOException;
import java.io.StringReader;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Namespace;
import org.jdom.input.SAXBuilder;
import org.xml.sax.InputSource;

public class DuXMLDoc {
    public List xmlElements(String xmlDoc) {
        if (xmlDoc!=null && !xmlDoc.equals("")) {
            Pattern p = Pattern.compile("\r|\n");
            Matcher m = p.matcher(xmlDoc);
            xmlDoc = m.replaceAll("");
        }//创建一个新的字符串
        StringReader read = new StringReader(xmlDoc);
        //创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
        InputSource source = new InputSource(read);
        //创建一个新的SAXBuilder
        SAXBuilder sb = new SAXBuilder();
        try {
            //通过输入源构造一个Document
            Document doc = sb.build(source);
            //取的根元素
            Element root = doc.getRootElement();
            System.out.println(root.getName());//输出根元素的名称(测试)
            //得到根元素所有子元素的集合
            List jiedian = root.getChildren();
            //获得XML中的命名空间(XML中未定义可不写)
            Namespace ns = root.getNamespace();
            Element et = null;
            for(int i=0;i<jiedian.size();i++){
                et = (Element) jiedian.get(i);//循环依次得到子元素
               
                System.out.println(et.getChild("users_id",ns).getText());
                System.out.println(et.getChild("users_address",ns).getText());
            }
           
            et = (Element) jiedian.get(0);
            List zjiedian = et.getChildren();
            for(int j=0;j<zjiedian.size();j++){
                Element xet = (Element) zjiedian.get(j);
                System.out.println(xet.getName());
            }
        } catch (JDOMException e) {
            // TODO 自动生成 catch 块
            e.printStackTrace();
        } catch (IOException e) {
            // TODO 自动生成 catch 块
            e.printStackTrace();
        }
        return null;
    }
    public static void main(String[] args){
        DuXMLDoc doc = new DuXMLDoc();
        String xml = "<?xml version=\"1.0\" encoding=\"gb2312\"?>"+
        "<Result xmlns=\"http://www.fiorano.com/fesb/activity/DBQueryOnInput2/Out\">"+
           "<row resultcount=\"1\">"+
              "<users_id>1001     </users_id>"+
              "<users_name>wangwei   </users_name>"+
              "<users_group>80        </users_group>"+
              "<users_address>1001号   </users_address>"+
           "</row>"+
           "<row resultcount=\"1\">"+
              "<users_id>1002     </users_id>"+
              "<users_name>wangwei   </users_name>"+
              "<users_group>80        </users_group>"+
              "<users_address>1002号   </users_address>"+
           "</row>"+
        "</Result>";
        doc.xmlElements(xml);
    }
}

}

第二种:对xml文件进行解析

package com.zuidaima.xml;  
  
import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.IOException;  
import java.util.List;  
  
import org.jdom.Document;  
import org.jdom.Element;  
import org.jdom.JDOMException;  
import org.jdom.input.SAXBuilder;  
  
/******************************************************************************* 
 * xml通用工具类 
 * @author www.zuidaima.com 
 */  
@SuppressWarnings("unchecked")  
public class XMLUtils  
{  
    public static String xml = "";  
  
    public static void init()  
    {  
        xml = "";  
    }  
  
    /*************************************************************************** 
     * 得到指定名称节点下的所有文本内容,包括节点(逆归) <暂不考虑节点属性情况> 
     *  
     * @param doc 
     *            xml文档对象 
     * @param e 
     *            要获取的节点对象 
     * @param exceptTag 
     *            要排除的节点名称 
     * @return 
     */  
  
    public static String getChildAllText(Document doc, Element e)  
    {  
        if (e != null)  
        {  
            if (e.getChildren() != null)  
            {  
                List<Element> list = e.getChildren();  
                xml += "<" + e.getName() + ">";  
                for (Element el : list)  
                {  
                    if(el.getChildren().size() > 0)  
                    {  
                        getChildAllText(doc, el);  
                    }  
                    else  
                    {  
                            xml += "<" + el.getName() + ">" + el.getTextTrim() + "</"  
                                    + el.getName() + ">";  
                    }  
                }  
                xml += "</" + e.getName() + ">" ;  
            }  
            else  
            {  
                    xml += "<" + e.getName() + ">" + e.getTextTrim() + "</"  
                            + e.getName() + ">";  
            }  
        }  
        return xml;  
    }  
  
    public static void main(String[] args) throws FileNotFoundException,  
            JDOMException, IOException  
    { // 如果有任何异常则抛出  
        SAXBuilder sb = new SAXBuilder(); // 新建立构造器  
        Document doc = null;  
        doc = sb  
                .build(new FileInputStream(  
                        "D:\\test.xml")); // 读入6.xml  
        Element root = doc.getRootElement(); // 取得根节点  
        // Element e = root.getChild("apptype1");  
  
        // System.out.println(e);  
        System.out.println(getChildAllText(doc, root));  
    }  
  
}  

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/140692.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 谈谈内存映射文件[通俗易懂]

    谈谈内存映射文件[通俗易懂]http://blog.csdn.net/ithzhang/article/details/7001650内存映射文件允许开发人员预订一块地址空间并为该区域调拨物理存储器,与虚拟内存不同的是,内存映射文件的物理存储器来自磁盘中的文件,而非系统的页交换文件。将文件映射到内存中后,我们就可以在内存中操作他们了,就像他们被载入内存中一样。内存映射文件主要有三方面的用途:1:系

    2022年6月17日
    31
  • Linux从入门到指令详解

    Linux从入门到指令详解一、概述我们为什么要学习Linuxlinux诞生了这么多年,以前还喊着如何能取代windows系统,现在这个口号已经小多了,任何事物发展都有其局限性都有其天花板。就如同在国内再搞一个社交软件取代腾讯一样,想想而已基本不可能,因为用户已经习惯于使用微信交流,不是说技术上实现不了解而是老百姓已经习惯了,想让他们不用,即使他们自己不用亲戚朋友还是要用,没有办法的事情。用习惯了windows操作系统,再让大家切换到别的操作系统基本上是不可能的事情,改变一个人已经养成的习惯太难。没有办法深入到普通老百姓的生

    2022年6月5日
    26
  • 使用Navicat进行ssh通道连接MySQL数据库(亲测可行)

    使用Navicat进行ssh通道连接MySQL数据库(亲测可行)

    2022年2月18日
    65
  • 解决Pycharm和pip都安装TensorFlow失败的问题(Windows 10)

    解决Pycharm和pip都安装TensorFlow失败的问题(Windows 10)pip报错:Couldnotfindaversionthatsatisfiestherequirementtensorflow(fromversions:)NomatchingdistributionfoundfortensorflowPycharm报错:Erroroccuredwheninstallingpackage‘tensorflow’解决…

    2022年8月26日
    4
  • 浅谈Java异常及其编译时异常和运行时异常的区别[通俗易懂]

    浅谈Java异常及其编译时异常和运行时异常的区别[通俗易懂]异常是程序编码和运行时经常发生的事件,了解异常有助于我们提高代码质量,增强系统的健壮性,这里总结一下载Java编程中,编译时异常和运行异常时的区别,并列举几种常见的异常,以供参考学习。

    2022年9月29日
    2
  • 输出最小值及所在数组下标_java数组最大值和下标

    输出最小值及所在数组下标_java数组最大值和下标packagepractice;importjava.util.Scanner;publicclassMaximumAndLowerMark{ publicstaticvoidmain(String[]args){ Scannersc=newScanner(System.in); intarr[]=newint[10]; for(inti=0;i<arr.length;i++){ System.out.print(

    2025年5月24日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号