XML基础学习

XML的元素和节点

元素(Element)是节点(Node)的扩展(Element的实例对象就是一个元素节点),除了元素之外,(属性)Attribute、文本节点(Text)、处理指令(PI)、 文档(Document)等等都是Node。元素只是节点的一种类型,元素节点是 信息 的容器。该信息可能是元素节点、文本节点、属性节点或其他类型的信息。

官方定义

  • 整个文档是一个文档节点
  • 每个 XML 标签是一个元素节点
  • 包含在 XML 元素中的文本是文本节点
  • 每一个 XML 属性是一个属性节点
  • 注释属于注释节点
<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book category="children">
  <title lang="en">Harry Potter</title> 
  <author>J K. Rowling</author> 
  <year>2005</year> 
  <price>29.99</price> 
</book>

<book category="cooking">
  <title lang="en">Everyday Italian</title> 
  <author>Giada De Laurentiis</author> 
  <year>2005</year> 
  <price>30.00</price> 
</book>

</bookstore>

在上面的 XML 中,根节点是 <bookstore>。文档中的所有其他节点都被包含在 <bookstore> 中。根节点 <bookstore> 有两个 <book> 节点。第一个 <book> 节点有四个节点:<title>, <author>, <year> 以及 <price>,其中每个节点都包含一个文本节点,“Harry Potter”, “J K. Rowling”, “2005” 以及 “29.99”。(官方解释)

节点树:
在这里插入图片描述

在 DOM 处理中一个普遍的错误是,认为元素节点包含文本。不过,元素节点的文本是存储在文本节点中的。在这个例子中:<year>2005</year>,元素节点 <year>,拥有一个值为 “2005” 的文本节点。“2005” 不是 <year> 元素的值!(官方解释)


<?xml version="1.0" encoding="UTF-8"?>
<!--1-->
<files>
	
	<!--1-->
	
	<!--1-->
	
	<file>E:\Tools\cpu-z_1.87-cn.zip</file>
	
	<!--1-->
	
	<!--1-->
	
	<file1>G:\Tools\cpu-z_1.87-cn.zip</file1>
	
	<!--1-->
	
</files>
package xml;


import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.InputStream;


public class ParseXML {

    public static void main(String[] args) {
        System.out.println(getFileName());
    }

    public static String getFileName(){
        try {
            InputStream in = Class.forName("xml.ParseXML").getResourceAsStream("file.xml"); // 以流的方式获取资源

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // newInstance()静态方法,生成一个实例
            DocumentBuilder builder = factory.newDocumentBuilder(); // DocumentBuilderFactory工厂对象就是创建DocumentBuilder实例的
            Document doc = builder.parse(in); // 返回一个文档对象

            Element element = doc.getDocumentElement();// 获取文档对象的根元素节点
            NodeList nl=element.getChildNodes();// 测试根元素节点有多少个孩子节点
            System.out.println(nl.getLength());

            for(int i=0;i<nl.getLength();i++){
                Node node=nl.item(i);
                System.out.println(node.getNodeName()); // 节点名称:如果节点是文本节点,那么有一个固定的值:#text
            }

        }catch (Exception e){
            e.printStackTrace();
        }
        return "";
    }
    
}

运行结果:根元素节点下有15个孩子节点(为什么呢?)

files
15
#text
#comment
#text
#comment
#text
file
#text
#comment
#text
#comment
#text
file1
#text
#comment
#text
Process finished with exit code 0

注释节点和元素节点上下都有空白文本节点

package xml;


import org.w3c.dom.Document;
import org.w3c.dom.Element;


import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.InputStream;


public class ParseXML {

    public static void main(String[] args) {
        System.out.println(getFileName());
    }

    public static String getFileName(){
        try {
            InputStream in = Class.forName("xml.ParseXML").getResourceAsStream("file.xml"); // 以流的方式获取资源

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // newInstance()静态方法,生成一个实例
            DocumentBuilder builder = factory.newDocumentBuilder(); // DocumentBuilderFactory工厂对象就是创建DocumentBuilder实例的
            Document doc = builder.parse(in); // 返回一个文档对象

            Element element = doc.getDocumentElement();// 获取文档对象的根元素节点
            System.out.println(element.getTagName()); // 测试
            
            /* element文档元素的根元素对象
               getFirstChild()获取根元素的孩子节点也就是#test(文本节点)
               getNextSibling()是获取#test第5兄弟节点file(元素节点,元素节点是信息的容器,信息可以是文本节点等)
               第二个getFirstChild()是获取file节点的孩子节点E:\Tools\cpu-z_1.87-cn.zip(文本节点)
               getNodeValue()就是获取该文本节点的值
             */
            String fileName = element.getFirstChild().getNextSibling().getNextSibling().getNextSibling().getNextSibling().getNextSibling().getFirstChild().getNodeValue();

            return fileName;

        }catch (Exception e){
            e.printStackTrace();
        }
        return "";
    }

}

解析xml拿到文件的绝对路径(file元素节点下的子节点,也就是文本节点的值)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值