1、XML:可拓展标记语言。用来描述生活中大量数据之间的关系
例如:<a>
<b>
<d></d>
</b>
<c>
</c>
</a>
关系:a下面有bc,b下面有d.
2、XML语法:文档声明
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
version:版本号
encoding:编码格式
standalone:是否独立
(1)元素:标签,命名规范
(2)属性
(3)注释:注释不能再文档声明之前。
(4)<![CDATA[内容]]>:cdata区,直接显示内容,不进行解析。
(5)命令:<?xml-stylesheet type="text/css" herf="01.css"?>
3、XML约束:dtd
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
DOCTYPE : 声明所遵循的DTD文件
<!DOCTYPE 书架 SYSTEM "文件名" >
<!ELEMENT 元素 元素(any enpty)类型或者内容>
<!ATTLIST 元素名
属性名 属性类型(CDATA、枚举、ID:设置属性为唯一值、ENTITY:实体) 设置说明(REQUIERD:必须的、IMPLIED:可选的、FIXED:固定的、默认值)>
引用实体:XML文档所用的(<!ENTITY copy "nihaoya"> -->©)
参数实体:用在DTD中(<!ENTITY % copy "nisdlk"> --> % copy)
4、XML解析
(1)解析方式分为dom和sax
(2)调整jvm内存大小:点击项目的run configuration
(3)jaxp对XML进行dom解析:
A、读取XML所有节点
@Test
public void read() throws Exception{
//获取工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//得到dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//获得文档
Document doc = builder.parse("src/book.xml");
Node node1 = doc.getElementsByTagName("书架").item(0);//获取书架标签
list(node1);
}
private void list(Node node1) {
if(node1 instanceof Element){
System.out.println(node1.getNodeName());
}
NodeList list1 = node1.getChildNodes();
for(int i=0;i<list1.getLength();i++){
list(list1.item(i));
}
}
B、添加节点
@Test
public void add() throws Exception{
//获取工程
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//得到dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//获得文档
Document doc = builder.parse("src/book.xml");
Element element = doc.createElement("售价");
element.setAttribute("nihao", "shiwo");
element.setTextContent("bbb");
Node node = doc.getElementsByTagName("书").item(0);
node.appendChild(element);
//node.insertBefore(newChild, refChild)
//写回文档
TransformerFactory tffactory = TransformerFactory.newInstance();
Transformer trans = tffactory.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(new FileOutputStream("src/book.xml")));
}
C、删除节点
@Test
public void delete() throws Exception{
//获取工程
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//得到dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//获得文档
Document doc = builder.parse("src/book.xml");
Element ele = (Element) doc.getElementsByTagName("售价").item(0);
ele.getParentNode().removeChild(ele);
//写回文档
TransformerFactory tffactory = TransformerFactory.newInstance();
Transformer trans = tffactory.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(new FileOutputStream("src/book.xml")));
}
(4)jaxp对XML文档进行sax解析
A、获取XML文档内容
@Test
public void test01() throws Exception{
//获取解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//获取解析器
SAXParser parser = factory.newSAXParser();
//获取读取器
XMLReader reader = parser.getXMLReader();
//设置内容读取器
reader.setContentHandler(new XMLHandler());
//读取XML文档
reader.parse("src/book.xml");
}
//获取所有标签
class XMLHandler extends DefaultHandler{
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("<"+qName+">");
for(int i = 0;attributes!=null&&i<attributes.getLength();i++){
System.out.println(attributes.getQName(i)+"="+attributes.getValue(i));
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("</"+qName+">");
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println(new String(ch,start,length));
}
}
//获取特定的标签的处理器
class TagHandler extends DefaultHandler{
private String current_tag;
private int num=2;
private int currentNum;
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
current_tag= qName;
if("作者".equals(current_tag)){
currentNum++;
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
current_tag=null;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if("作者".equals(current_tag)&¤tNum==num){
System.out.println(new String(ch,start,length));
}
}
}
//解析JavaBean的处理器
class BeanHandler extends DefaultHandler{
private List<Book> list =new ArrayList<Book>();
private String current_tag;
private Book book1;
public List<Book> getList() {
return list;
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
current_tag=qName;
if("书".equals(current_tag)){
book1 = new Book();
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
if("书".equals(qName)){
list.add(book1);
book1=null;
}
current_tag=null;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if("书名".equals(current_tag)){
book1.setName(new String(ch,start,length));
}
if("作者".equals(current_tag)){
book1.setAuthor(new String(ch,start,length));
}
if("价格".equals(current_tag)){
book1.setPrice(new String(ch,start,length));
}
}
}
(5)dom4j对XML进行解析:需要导入包
A、读取文档的指定标签
@Test
public void read() throws Exception{
//读取器
SAXReader reader = new SAXReader();
//获取文档
Document document = reader.read("src/book.xml");
//获取根节点
Element ele = document.getRootElement();
//获取根节点下面的元素
Element book = (Element) ele.elements("书").get(1);
//获取需要的内容
String value = book.element("书名").getText();
System.out.println(value);
}
B、添加结点
@Test
public void add() throws Exception{
SAXReader reader = new SAXReader();
Document doc = reader.read("src/book.xml");
Element ele = doc.getRootElement();
Element book = ele.element("书");
book.addElement("售价").addAttribute("aaa", "bbbb").addText("2002");
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
//写回
XMLWriter writer = new XMLWriter( new FileOutputStream( "src/book.xml" ), format );
writer.write( doc );
writer.close();
}
(6)XPath
得到特定的书名下的内容,查看文档
@Test
public void test01() throws Exception{
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("src/book.xml"));
String value = doc.selectSingleNode("//书名").getText();
System.out.println(value);
}
(7)schema
查看w3c文档