java xml解析

DOM解析

DOM解析方式,将所有的xml文件内容加载到内存中
优点:获取数据简单
缺点:文件大时占用大量内存

常用类和方法
javax.xml.parsers.DocumentBuilderFactory
static DocumentBuilderFactory newInstance() 新建一个DocumentBuilderFactory实例
DocumentBuilder newDocumentBuilder() 创建一个DocumentBuilder实例

javax.xml.parsers.DocumentBuilder
Document parse(File f)
Document parse(String url)
Document parse(InputStream in)
解析来自文件、url或输入流的xml文档,返回解析后的文档

org.w3c.dom.Document
Element getDocumentElement() 返回文档根元素

org.w3c.dom.Element
String getTagName() 获取标签名
String getAttribute(String name) 返回给定标签名的属性值,没有该标签则返回空字符串

org.w3c.dom.Node
NodeList getChildNodes() 返回包含该节点所有子元素的节点列表
Node getFirstChild()
Node getLastChild()
获取该节点的第一个或最后一个子节点,没有子节点返回null
Node getNextSibling()
Node getPreviousSibling()
获取该节点的下一个或上一个兄弟节点,没有兄弟节点返回null
Node getParentNode() 获取父节点,没有父节点返回null
NamedNodeMap getAttributes() 返回含有描述该节点所有属性的Attr节点的映射表
String getNodeName() 获取该节点名字。该节点是Attr节点时,返回属性名
String getNodeValue() 返回该节点的值。该节点是Attr节点时,返回属性值

org.w3c.dom.CharacterData
String getData() 返回存储在节点中的文本

org.w3c.dom.NodeList
int getLength() 返回节点数
Node item(int index) 返回给定索引值的节点

org.w3c.dom.NamedNodeMap
int getLength() 获取该节点映射表中的节点数
Node item(int index) 返回给定索引值的节点

例子:

<?xml version="1.0"?>
<font>
    <a href="http://baidu.com">1</a>
    <b>111
        <first>2</first>
        <last>3</last></b>
</font>
public class Get {

    public static void main(String[] args) {
        try {
        	File file = new File(filepath);
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder documentBuilder = factory.newDocumentBuilder();
            // 解析xml文件
            Document document = documentBuilder.parse(file);

            // 获取根节点
            Element element = document.getDocumentElement();
            // 获取根节点下的所有标签
            NodeList childNodes = element.getChildNodes();
            for (int i = 0; i < childNodes.getLength(); i++) {
                Node child = childNodes.item(i);
                if (child instanceof Element) {
                    Element item = (Element) child;
                    String tag = item.getTagName();
                    if ("a".equals(tag)) {
                        System.out.println("a标签href属性获取:" + item.getAttribute("href")); // a标签href属性获取:http://baidu.com
                    } else if ("b".equals(tag)) {
                        Node firstChild = item.getFirstChild(); // 第一个子标签其实是该标签的值
                        Node nextSibling = firstChild.getNextSibling();
                        Node lastChild = item.getLastChild();
                        System.out.println("b标签的第一个子标签: " + firstChild.getNodeName() + " , " + firstChild.getTextContent()); // b标签的第一个子标签: #text , 111
                        System.out.println("b标签的第一个子标签的下一个标签: " + nextSibling.getNodeName() + " , " + nextSibling.getTextContent()); // b标签的第一个子标签的下一个标签: first , 2
                        
                        System.out.println("b标签的最后一个子标签" + lastChild.getNodeName() + " , " + lastChild.getTextContent()); // b标签的最后一个子标签last , 3
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

输出结果:

a标签href属性获取:http://baidu.com
b标签的第一个子标签: #text , 111
        
b标签的第一个子标签的下一个标签: first , 2
b表啊的最后一个子标签last , 3

很明显,从输出结果上看,DOM解析方式中,将标签里的每行都当作是一个子节点,在数据获取的时候会出现奇怪的情况,明明是获取第一个子标签item.getFirstChild();,但实际上是获取了标签开头那一行的内容,第二个子标签才是真正想要的标签

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值