JAVA解析XML的三种方式

作为一个小白,代码写久了以前看不懂的东西现在懂了好多,今天花了一些时间在网上看关于XML的解析,然后自己手写模仿一下(笑)
耐心写完发现并不难,有益于提升自信2333。
废话少说,下面是正题:
首先附上XML文件,文件名为mine.xml(一股萌新的味道…)

<?xml version="1.0" encoding="UTF-8"?>

<foodStore>
    <food id="1">
        <name>包子</name>
        <pi>包子皮</pi>
        <xian>包子馅儿</xian>
    </food>
    <food id="2">
        <name>饺子</name>
        <pi>饺子皮</pi>
        <xian>饺子馅儿</xian>
    </food>
</foodStore>

不要在意标签名儿,中国人应该都能看懂(笑……)。下面时JAVA代码:

    public static void main(String[] args)
    {
        //dom解析xml方法
        GetXmlByDom();
        //JDom解析xml方法
        GetXmlByJDom();
        //dom4j解析xml方法
        GetXmlByDom4J();
    }

    /*
    * dom解析xml
    * 数据比较多时耗费内存,要求性能
    * 建议用以解析简单的xml
    *
    * */
    public static void GetXmlByDom()
    {
        System.out.println("DOM解析:----------开始----------");
        //DocumentBuilderFactory对象
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        try {
            //创建一个DocumentBuilder对象
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            //加载xml
            //Document引用org.w3c.dom
            Document document =  documentBuilder.parse("./resource/mine.xml");
            //获取mine.xml里每一个food节点
            NodeList foodList = document.getElementsByTagName("food");
            System.out.println("DOM解析:一共有"+foodList.getLength()+"种食物..");
            System.out.println("DOM解析:以下为FoodStore里详细表单:");
            //遍历food节点
            for(int i=0;i<foodList.getLength();i++)
            {
                System.out.println("DOM解析:----------第"+(i+1)+"种食物:----------");
                //获取对应food节点
                Node food = foodList.item(i);
                //获取每一个food节点下的属性
                NamedNodeMap foodMore = food.getAttributes();
                System.out.println("DOM解析:有"+foodMore.getLength()+"个属性:");
                //遍历food里的属性
                //属性并非子节点
                for (int k = 0;k<foodMore.getLength();k++)
                {
                    Node attr = foodMore.item(k);
                    System.out.println("DOM解析:属性名:"+attr.getNodeName()+",属性值:"+attr.getNodeValue());
                }
                //解析子节点
                //获取子节点列表,返回为NodeList类型的数据
                NodeList childNodes = food.getChildNodes();
                System.out.println("DOM解析:有"+childNodes.getLength()+"个子节点");
                for (int j=0;j<childNodes.getLength();j++)
                {
                    //区分节点类型(text,element)
                    if (childNodes.item(j).getNodeType()==Node.ELEMENT_NODE)
                    {
                        System.out.println("DOM解析:第"+j+"个子节点属性名:"+childNodes.item(j).getNodeName()+";属性值:"+childNodes.item(j).getFirstChild().getNodeValue());
                    }
                }
            }
            System.out.println("DOM解析:----------结束----------");

        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }



    /*
    * JDOM解析
    * 需要JDom的jar包
    */
    public static void GetXmlByJDom()
    {
        System.out.println("JDOM解析:----------开始----------");
        ArrayList<Food> foodList = new ArrayList<Food>();
        //创建一个SAXBuilder对象
        //需要JDOM.jar
        SAXBuilder saxBuilder = new SAXBuilder();
        InputStream inputStream;
        try {
            //将xml加载到输入流
            inputStream = new FileInputStream("./resource/mine.xml");
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"UTF-8");
            //将输入流加载到saxBuilder中
            org.jdom.Document document = saxBuilder.build(inputStream);
            //根据document获取xml根节点
            Element element = document.getRootElement();
            //获取根节点下的子节点List
            List<Element> myFoodList = element.getChildren();
            //xml-->输入流-->saxBuilder-->Document-->List
            //解析
            for(Element food:myFoodList)
            {
                Food foodBean = new Food();
                System.out.println("JDOM解析:----------第"+(myFoodList.indexOf(food)+1)+"种食物----------");
                //遍历属性
                List<Attribute> attributes = food.getAttributes();
                for (Attribute attribute:attributes)
                {
                    //属性名
                    String attrName = attribute.getName();
                    //属性值
                    String attrValue = attribute.getValue();
                    System.out.println("JDOM解析:属性名:"+attrName+",属性值:"+attrValue);
                    //为food对象的id属性赋值
                    if (attrName.equals("id"))
                    {
                        foodBean.setId(attrValue);
                    }
                }
                //遍历子节点
                List<Element> elements = food.getChildren();
                for (Element ele : elements)
                {
                    System.out.println("JDOM解析:子节点名:"+ele.getName()+",子节点值:"+ele.getValue());
                    //假装是给foodbean赋值的代码...
                }
            }
            System.out.println("JDOM解析:----------结束----------");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (JDOMException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

    /*
    * DOM4J解析
    * Sun都在用的解析啊!
    * 别问了,它哪儿都好(笑哭)
    * 记得引用DOM4J的jar包!(严肃脸)
    * */
    public static void GetXmlByDom4J()
    {
        System.out.println("DOM4J解析:----------开始----------");
        //还是解析mine,xml文件
        //创建SAXReader对象
        SAXReader saxReader = new SAXReader();
        try {
            //读取mine.xml文件,并赋给document
            org.dom4j.Document document = saxReader.read("./resource/mine.xml");
            //再获取根节点,有没有觉得一丝丝熟悉(笑)
            org.dom4j.Element element = document.getRootElement();
            //迭代器
            Iterator iterator = element.elementIterator();
            //遍历迭代器,获取根节点中的信息
            while (iterator.hasNext())
            {
                org.dom4j.Element food = (org.dom4j.Element)iterator.next();
                //获取属性
                List<org.dom4j.Attribute> attributes = food.attributes();
                for (org.dom4j.Attribute attribute:attributes)
                {
                    System.out.println("DOM4J解析:属性名:"+attribute.getName()+",DOM4J解析:属性值:"+attribute.getValue());
                }
                //获取子节点
                Iterator iterator1 = food.elementIterator();
                while (iterator1.hasNext())
                {
                    org.dom4j.Element foodChild = (org.dom4j.Element) iterator1.next();
                    System.out.println("DOM4J解析:子节点名:"+foodChild.getName()+",DOM4J解析:子节点值:"+foodChild.getStringValue());
                }
                if (iterator.hasNext())
                {
                    System.out.println("DOM4J解析:--------------------------------------------");
                }
            }
            System.out.println("DOM4J解析:----------结束----------");
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

以下是一些补充:
1/关于io流,记得加try catch
2/JDOM和DOM4J需要下载导入相应的jar包
3/关于什么Element、Document这些类,用哪个方法就要用哪个jar包里对应的类
然后是最重要的一条补充:
原文网址:P
https://www.cnblogs.com/longqingyang/p/5577937.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值