一、xml简介
可扩展标记语言 () 于 1998 年 2 月 10 日成为 W3C 的推荐标准Xml用来设计传输和存储数据,html用来是设计显示数据。
Xml没有预定义标签,需要进行自定义。
平时在进行开发的时候,例如进行hibernate开发的时候,我们可以导入自己预先定地的dtd文件(标记符的语法规则)进行规范化。
二.XML 与 HTML的主要差异
XML 不是 HTML的替代。
XML 和 HTML为不同的目的而设计:
XML 被设计为传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息,而 XML旨在传输信息。
三、xml语法
1、声明版本,编码,文档是否独立 <?xml version="1.0" encoding=" UTF-8 "?>2、字符引用(charactor reference):&#十进制,&#x十六进制
3、实体引用(entity reference):lt,gt,amp,quot,apos,分别表示,小于,大于,&,引号,省略号,可以在DTD中定义
4、CDATA(CDATA section)原始字符,<![CDATA[这里面包含内容]]>
5、处理指令,<? ?>,如:<? Xml-stylesheet href= ” mystyle.css ” type= ” text/css ” ?>
6、注释<!--这里注释-->
四、Dom解析:树形解析器
1、要读入xml,首先需要DocumentBuilder对象,你可以从DocumentBuilderFactory中获得该对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
2、读入某个xml文档
Document doc = builder.parse(new File());
Document doc = builder.parse(new URL());
Document doc = builder.parse(new InputStream());
3、返回根节点
Element root = doc.getDocumentElement();
4、完成实例:
package cn.itcast.xml;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
//使用dom方式对xml文档进行CRUD
public class Demo3 {
//读取<书名>C++教程</书名>
@Test
public void read1() throws Exception
{
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse("src/book.xml");
NodeList list=document.getElementsByTagName("书名");
Node node=list.item(1);
String content=node.getTextContent();
System.out.println(content);//C++教程
}
//得到文档中所有标签
@Test
public void read2() throws Exception
{
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse("src/book.xml");
NodeList list=document.getElementsByTagName("书名");
Node root=document.getElementsByTagName("书架").item(0);
list(root);
}
private void list(Node node) {
Node child;
if (node instanceof Element)
System.out.println(node.getNodeName());
NodeList nodelist=node.getChildNodes();
for (int i=0;i<nodelist.getLength();i++)
{
child=nodelist.item(i);
list(child);
}
}
//得到文档中标签属性<书名 name="xxxx">java web就业</书名>
@Test
public void read3() throws Exception
{
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse("src/book.xml");
NodeList list=document.getElementsByTagName("书名");
Node node=list.item(0);
if(node.hasAttributes()){
NamedNodeMap nodemap=node.getAttributes();
for(int i=0;i<nodemap.getLength();i++)
{
Node nd=nodemap.item(i);
String strname=nd.getNodeName();
String strval=nd.getNodeValue();
System.out.println(strname+":"+strval);//name:dddd
}
}
Element node2=(Element)list.item(0);
String str3=node2.getAttribute("name");
System.out.println("__"+str3);//__dddd
}
//<售价>10</售价>
@Test
public void add() throws Exception{
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse("src/book.xml");
//创建节点
Element price=document.createElement("售价");
price.setTextContent("59.0元");
//把创建的节点放到第一本书上
document.getElementsByTagName("书").item(0).appendChild(price);
//把跟新后的内容写回文档
Transformer transformer=TransformerFactory.newInstance().newTransformer();
DOMSource source=new DOMSource(document);
FileOutputStream outstream =new FileOutputStream(new File("src/outbook.xml"));
StreamResult reslut=new StreamResult(outstream);
transformer.transform(source, reslut);
outstream.close();
}
//向文档中指定位置上添加节点 <售价>10</售价>
@Test
public void add2() throws Exception{
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse("src/book.xml");
//创建节点
Element price=document.createElement("售价");
price.setTextContent("59.0元");
//得到参考节点
Element refNode=(Element)document.getElementsByTagName("售价").item(0);
//得到挂崽的节点
Element book=(Element)document.getElementsByTagName("书").item(0);
//把创建的节点放到第一本书上
document.getElementsByTagName("书").item(0).appendChild(price);
// 往book节点指定位置插值
book.insertBefore(price, refNode);
Transformer transformer=TransformerFactory.newInstance().newTransformer();
DOMSource source=new DOMSource(document);
FileOutputStream outstream =new FileOutputStream(new File("src/outbook2.xml"));
StreamResult reslut=new StreamResult(outstream);
transformer.transform(source, reslut);
outstream.close();
}
//向文档节点 添加属性 <售价>10</售价>
@Test
public void addAtt() throws Exception{
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse("src/book.xml");
//得到参考节点
Element refNode=(Element)document.getElementsByTagName("售价").item(0);
refNode.setAttribute("addAtrr","new cha ru value");
Transformer transformer=TransformerFactory.newInstance().newTransformer();
DOMSource source=new DOMSource(document);
FileOutputStream outstream =new FileOutputStream(new File("src/outbook3.xml"));
StreamResult reslut=new StreamResult(outstream);
transformer.transform(source, reslut);
outstream.close();
}
//删除 <售价>10</售价>
@Test
public void delete() throws Exception{
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse("src/book.xml");
//得到要删除的节点
Element refNode=(Element)document.getElementsByTagName("售价").item(0);
refNode.getParentNode().removeChild(refNode);
Transformer transformer=TransformerFactory.newInstance().newTransformer();
DOMSource source=new DOMSource(document);
FileOutputStream outstream =new FileOutputStream(new File("src/outbook3.xml"));
StreamResult reslut=new StreamResult(outstream);
transformer.transform(source, reslut);
outstream.close();
}
//更新 售价
@Test
public void update() throws Exception{
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse("src/book.xml");
//得到要更新的节点
Element refNode=(Element)document.getElementsByTagName("售价").item(0);
refNode.setTextContent("1000");
Transformer transformer=TransformerFactory.newInstance().newTransformer();
DOMSource source=new DOMSource(document);
FileOutputStream outstream =new FileOutputStream(new File("src/outbook3.xml"));
StreamResult reslut=new StreamResult(outstream);
transformer.transform(source, reslut);
outstream.close();
}
}
5、实例4xml:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<书架>
<书>
<书名 name="dddd">java web就业</书名>
<作者>张孝祥</作者>
<售价>40</售价>
</书>
<书>
<书名>C++教程</书名>
<作者>自己</作者>
<售价>50</售价>
</书>
</书架>
6、sax解析xml文档
book对象代码:
package cn.itcast.sax;
public class Book {
private String name;
private String author;
private String price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
解析代码:
package cn.itcast.sax;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
public class Demo3 {
/**
* sax解析xml文档
*/
public static void main(String[] args) throws Exception {
//1.创建解析工厂
SAXParserFactory factory=SAXParserFactory.newInstance();
//2.得到解析器
SAXParser sp=factory.newSAXParser();
//3.得到读取器
XMLReader reader=sp.getXMLReader();
//4.设置内容处理器
BeanListHandler handle=new BeanListHandler();
reader.setContentHandler(handle);
//5.读取xml文档内容
reader.parse("src/book.xml");
List<Book> list=handle.getList();
list.iterator();
}
}
//把每一本书封装到一个book对象,并把book对象
class BeanListHandler extends DefaultHandler{
private List<Book> list=new ArrayList<Book>();
public List<Book> getList() {
return list;
}
private String currentTag;
private Book book;
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
currentTag=qName;
if("书".equals(currentTag)){
book=new Book();
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if("书名".equals(currentTag)){
book.setName(new String(ch,start,length));
}
if("作者".equals(currentTag)){
book.setAuthor(new String(ch,start,length));
}
if("售价".equals(currentTag)){
book.setPrice(new String(ch,start,length));
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if(qName.equals("书")){
list.add(book);
book=null;
}
currentTag=null;//这句有必要
}
}
xml还是上面的src/book.xml
7、dom4j解析xml
package cn.itcast.dom4j;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.OutputStreamWriter;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;
public class Demo1 {
public static void main(String[] args) throws Exception {
read();
}
//读第 2 本书的信息 <书名 name="xxxx">C++教程</书名>
private static void read() throws DocumentException {
SAXReader reader=new SAXReader();
Document document=reader.read(new File("src/book.xml"));
Element root=document.getRootElement();
Element book=(Element) root.elements("书").get(1);
String value=book.element("书名").getText();
String value2=book.element("书名").attributeValue("name");
System.out.println(value +";"+value2);
}
//在第一本上添加一个新的售价
@Test
public void add() throws Exception{
SAXReader reader=new SAXReader();
Document document=reader.read(new File("src/book.xml"));
Element book=document.getRootElement().element("书");
book.addElement("售价").setText("111");
//XMLWriter writer=new XMLWriter(new FileWriter("src/book.xml"));
//XMLWriter writer=new XMLWriter(new OutputStreamWriter(new FileOutputStream("src/book.xml"), "UTF-8"));
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("gb2312");
XMLWriter writer=new XMLWriter(new OutputStreamWriter(new FileOutputStream("src/book.xml"), "gb2312"),format);
writer.write(document);
writer.close();
}
//在第一本书指定位置上添加一个新的售价,更改List集合
@Test
public void add2() throws Exception{
SAXReader reader=new SAXReader();
Document document=reader.read(new File("src/book.xml"));
Element book=document.getRootElement().element("书");
List list=book.elements();//[书名,作者,售价]
Element price=DocumentHelper.createElement("售价");
price.setText("309元");
list.add(2,price);
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("gb2312");
XMLWriter writer=new XMLWriter(new OutputStreamWriter(new FileOutputStream("src/book.xml"), "gb2312"),format);
writer.write(document);
writer.close();
}
//删除上面的节点
public void delete() throws Exception {
SAXReader reader=new SAXReader();
Document document=reader.read(new File("src/book.xml"));
Element price=document.getRootElement().element("书").element("售价");
price.getParent().remove(price);
}
//更新节点
@Test
public void update() throws Exception{
SAXReader reader=new SAXReader();
Document document=reader.read(new File("src/book.xml"));
Element book=(Element) document.getRootElement().elements("书").get(1);
book.element("作者").setText("张三");
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("gb2312");
XMLWriter writer=new XMLWriter(new OutputStreamWriter(new FileOutputStream("src/book.xml"), "gb2312"),format);
writer.write(document);
writer.close();
}
}
8、dom4j用xpath获取xml数据
package cn.itcast.dom4j;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.OutputStreamWriter;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;
//应用xpath提取xml文档的数据,需要包jaxen-1.1-beta-6.jar
public class Demo4 {
public static void main(String[] args) throws Exception {
SAXReader reader=new SAXReader();
Document document=reader.read(new File("src/book.xml"));
String value=document.selectSingleNode("//作者").getText();//第一个值
System.out.println(value);
}
}