Java中的解析Xml

1.xml的格式(将xml拖入到项目中了)

<?xml version="1.0" encoding="UTF-8"?>
<class>
          <student id="1">
              <name>张三</name>
              <age>23</age>
              <sex>男</sex>
              <grade>90</grade>
          </student>
        <student id="2">
              <name>李四</name>
              <age>24</age>
              <sex>女</sex>
              <grade>95</grade>
          </student>
</class>

2.DOM方式解析xml

第一步:创建一个DocumentBuilderFactory对象(这是一个工厂类,用它的newInstance方法创建对象)

    DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();

第二步:通过dbf实例的newDocumentBuilder方法创建一个DocumentBuilder对象(此处需捕获异常)

    DocumentBuilder db=dbf.newDocumentBuilder();

第三步:通过db实例的parse方法创建一个Document对象(参数有很多种类型,这里取它的相对路径,填绝对路径也可以)

    Document document=db.parse("students.xml");

第四步:通过document实例的getElementsByTagName方法获得一个NodeList对象(这里说一下,导入的包应该是org.w3c.dom,上下文中也是如此,方法的参数为标签名,如class,student)

    NodeList nodelist=document.getElementsByTagName("student");

可能有人会问,如果我们完全不知道xml的标签名了,这个我也不太清楚,DOM方式解析xml这里只探讨知道标签名的情况。

第五步:获得nodelist里面所有该标签的属性,即id。

分2中情况,第一种:不知道student有什么属性,那么需要遍历nodelist,并通过nodelist的item方法得到每一个Node对象。

再通过node实例的getAttributes获得NamedNodeMap对象,即所有Student属性的集合。然后再遍历attrs实例。通过attrs实例的item方法再得到每一个Node对象。这个对象对应的是student单个的属性与属性值。最后通过attr实例的getNodeName与getNodeValue方法获得属性名与属性值

    for(int i=0;i<nodelist.getLength();i++)
                {
                Node node=nodelist.item(i);

               NamedNodeMap attrs=node.getAttributes();

    for(int j=0;j<attrs.getLength();j++)
                    {
                        Node attr=attrs.item(j);
                        System.out.print("属性名:"+attr.getNodeName());
                    System.out.println("属性值:"+attr.getNodeValue());
                    }

                }

第二种情况:知道student属性名。通过nodelist的item方法得到每一个Node对象并强制转换为Element对象,然后再通过element实例的getAttribute方法获得属性值,参数为

属性名。

for(int i=0;i<nodelist.getLength();i++)
                {
                    Element element=(Element)nodelist.item(i);
                    System.out.println("id的属性值为"+element.getAttribute("id"));

                   }

第六步 :获取student所有子节点的节点名与节点值

首先还是遍历nodelist对象,并通过nodelist的item方法获得每一个Node对象,通过node实例的getChildNodes获得一个NodeList对象,该对象是student所有节点的集合

然后遍历这个childnodes实例,再通过这个childnodes实例的item方法得到每个node对象,通过node对象的getNodeName与getTextContent方法分别获得节点名与

节点值。

            for(int j=0;j<childnodes.getLength();j++)
                    {
                        if(childnodes.item(j).getNodeType()==Node.ELEMENT_NODE)
                        {                    
                        System.out.println(childnodes.item(j).getNodeName());
                        System.out.println(childnodes.item(j).getTextContent());
                        }
                    }

这里有2点必须注意,一是通过getNodeType方法排除空格,因为在xml中,java认为空格也是一个子节点

 而是 不能getNodeValue去获取节点的值。这是为什么了,用一张图说明,因为节点也是有类型的。上述说到的空格节点就是test类型的节点。

简单点说,就是student是元素节点,id是属性节点,张三是文本节点,这样就很好理解了。


节点类型   NodeType   Named Constant          nodename                         nodevalue
Element       1                ELEMENT_NODE        element name                     null
Attr                 2               ATTRIBUTE_NODE       属性名称                             属性值
Text                3               TEXT_NODE                   #text                                   节点内容







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值