前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JAVA解析XML格式字符串「建议收藏」

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

作者头像
全栈程序员站长
发布2022-09-01 11:09:01
1.9K0
发布2022-09-01 11:09:01
举报

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

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

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

代码语言:javascript
复制
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文件进行解析

代码语言:javascript
复制
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.cn/140692.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档