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元素节点下的子节点,也就是文本节点的值)