XML是Extensible ,arkup Language 即可扩展标记语言的缩写,是一种简单的数据存储语言,使用一些列简单的标记来描述数据。
XML与操作系统、编程语言的开发平台都无关。
规范统一。
<---这个是第一行
a为根元素,具有唯一性。其余都为根元素的子元素。
version表示文档符合XML1.0规范,encoding表示文档文字编码。
b.c.d为标签,成对使用来界定字符数据。
由开始标签,元素内容和结束标签组成。
元素的命名规则如下:
名称中可以包含字母、数字或者其他字符。
名称不能以数字或者标点符号开始。
名称不能以字符xml(或者XML、Xml)开始。
名称中不能包含空格。
属性定义语法格式:<元素名 属性名=“属性值”>
一个元素可以有多个属性,多个属性之间用空格隔开。
属性值中不能直接包含 < " & 等字符。
属性可以加在任何一个元素的起始标签上,但不能加在结束标签上。
<== < ; >=>; &==&; "=="; '== ' ;
如果在元素的文本中有大量的特殊字符,可以使用CDATA节处理。
必须有XML声明语句。
必须有且仅有一个根元素。
标签大小写敏感。
属性值用双引号括起来。
标签成对出现。
元素正确嵌套。
创建解析器工厂对象,即DocumentBuilderFactory对象。
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance( );
由解析器工厂对象创建解析器对象,即DocumentBuilder对象。
DocumentBuilder db=dbf.newDocumentBuilder( );
由解析器对象对指定的XML文件进行解析,构建相应的DOM树,创建Document对象。
Document doc =db.parse( xml 文档路径);
以Document对象为起点对DOM树的节点进行增加,删除,修改,查询等操作。
DOM中的方法自己查查API就好,有点多,手打累。
使用DOM解析如下xml,打印所有的书名,作者,价格,如果价格有种类,输出货币种类,而后添加一本书,书名西游记,作者吴承恩,售价85元。
三国演义
罗贯中
30元
水浒传
施耐庵
35元
解答如下:
public class DOMdemo1 {
private Document document;
public void getDom(){
//获得解析器工厂
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
try {
//根据解析器工厂获得解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//解析器解析XML文件获得Document对象
document=builder.parse("文件路径");
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//获取书籍名称及其他信息
public void showInfo(){
//以Document做起点,拿到所有的book节点
NodeList brands=document.getElementsByTagName("book");
//遍历books,从中拿到每一个book
for (int i = 0; i
DOM4J是目前使用非常广泛的一种解析XML的技术,与DOM相比,其使用灵活,操作简单。DOM4J是一个易用的开源的库,最大的特色是使用大量的接口。
DOM4J在使用前要导入DOM4j包,这个不多讲了。
DOM4J只需要两步就可以获取Document对象。
SAXRreder reader = new SAXRreader( ) ;
Document document = reder.read(new File("XML文档路径")) ;
其它流程就和DOM解析基本一样了,不过调用的方法相差还是比较多的,需要多用一用。
使用DOM4j解析如下xml,打印所有的书名,作者,价格,如果价格有种类,输出货币种类,而后添加一本书,书名西游记,作者吴承恩,售价85元。
三国演义
罗贯中
30元
水浒传
施耐庵
35元
解答如下:
public class SecondDOM4jTXT {
private Document document;
public void loadDocument(){
SAXReader saxReader=new SAXReader();
try {
document =saxReader.read(new File("文件路径"));
} catch (DocumentException e) {
e.printStackTrace();
}
}
public void show(){
Element root=document.getRootElement();
Iterator eleBook= (Iterator) root.elementIterator();
while(eleBook.hasNext()){
Element book =(Element) eleBook.next();
Iterator eleTypes = book.elementIterator();
while (eleTypes.hasNext()){
Element type = (Element)eleTypes.next();
if(type.attribute("currercy")!=null){
System.out.println("\t"+type.attributeValue("currercy")+""+type.getText());
}else {
System.out.println("\t"+type.getText());
}
}
System.out.println();
}
}
public void addbook(){
Element root =document.getRootElement();
Element elbook =root.addElement("book");
Element title =elbook.addElement("title");
title.setText("西游记");
Element author =elbook.addElement("author");
author.setText("吴承恩");
Element price =elbook.addElement("price");
price.setText("85元");
}
public void save(String path){
OutputFormat format = OutputFormat.createPrettyPrint();
try {
XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(path)),format);
writer.write(document);
writer.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
SecondDOM4jTXT sd=new SecondDOM4jTXT();
sd.loadDocument();
sd.addbook();
sd.save("保存路径");
sd.show();
}
}
在使用DOM和DOM4j时,没有什么难点,获取了Document对象往下找就好了,想找什么就调用什么方法。
练习:
分别使用DOM和DOM4j两种方式解析下面的XML文档,输出所有学员信息。
苏虹
20
北方交大
李明
21
北大
DOM
public class SecondDOM {
private Document document;
public void getDom(){
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
document=builder.parse("studens.xml");
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void showInfo(){
NodeList student=document.getElementsByTagName("student");
for (int i = 0; i
DOM4j
public class SecondDOM4j {
private Document document;
public void loadDocument(){
SAXReader saxReader=new SAXReader();
try {
document =saxReader.read(new File("students.xml"));
} catch (DocumentException e) {
e.printStackTrace();
}
}
public void show(){
Element root=document.getRootElement();
Iterator elestu= (Iterator) root.elementIterator();
while(elestu.hasNext()){
Element student =(Element) elestu.next();
Iterator eleTypes = student.elementIterator();
while (eleTypes.hasNext()){
Element type = (Element)eleTypes.next();
System.out.println("\t"+type.getText());
}
System.out.println();
}
}
public static void main(String[] args) {
SecondDOM4j sd=new SecondDOM4j();
sd.loadDocument();
sd.show();
}
}
在上题XML文档中添加两个学员信息。张三 18 人民大学 李四 19 浙江大学
DOM
public class ThirdDOM {
private Document document;
public void getDom(){
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
document=builder.parse("students.xml");
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void showInfo(){
NodeList student=document.getElementsByTagName("student");
for (int i = 0; i
DOM4j
public class ThirdDOM4j {
private Document document;
public void loadDocument(){
SAXReader saxReader=new SAXReader();
try {
document =saxReader.read(new File("students.xml"));
} catch (DocumentException e) {
e.printStackTrace();
}
}
public void show(){
Element root=document.getRootElement();
Iterator elestu= (Iterator) root.elementIterator();
while(elestu.hasNext()){
Element student =(Element) elestu.next();
Iterator eleTypes = student.elementIterator();
while (eleTypes.hasNext()){
Element type = (Element)eleTypes.next();
System.out.println("\t"+type.getText());
}
System.out.println();
}
}
public void addstu(){
Element root =document.getRootElement();
Element elstu =root.addElement("student");
Element name =elstu.addElement("name");
name.setText("张三");
Element age =elstu.addElement("age");
age.setText("18");
Element school =elstu.addElement("school");
school.setText("人民大学");
Element root1 =document.getRootElement();
Element elstu1 =root1.addElement("student");
Element name1 =elstu1.addElement("name");
name1.setText("李四");
Element age1 =elstu1.addElement("age");
age1.setText("19");
Element school1 =elstu1.addElement("school");
school1.setText("浙江大学");
}
public void save(String path){
OutputFormat format = OutputFormat.createPrettyPrint();
try {
XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(path)),format);
writer.write(document);
writer.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ThirdDOM4j td=new ThirdDOM4j();
td.loadDocument();
td.addstu();
td.save("studentsDOM4j.xml");
td.show();
}
}