申明:内容大多来自传智播客黑马
a.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!--
这是注释
SYSTEM 系统硬盘位置
PUBLIC 网络公共位置,如"a.dtd" "www.a.com"
-->
<!-- 外部引入 -->
<!DOCTYPE 人 SYSTEM "a.dtd">
<!-- 内部引入
<!DOCTYPE 人 [
<!ELEMENT 人 (国家+,其他国家,其他说明)>
<!ELEMENT 国家 (姓名,年龄)>
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 其他国家 (#PCDATA)>
<!ELEMENT 其他说明 (#PCDATA)>
]>
-->
<人>
<国家 value="China" 首都="北京">
<姓名>张三</姓名>
<年龄>35</年龄>
</国家>
<国家 value="USA" 首都="华盛顿">
<姓名>Tom&Welon</姓名>
<年龄>25</年龄>
</国家>
<其他国家/>
<其他说明>
<![CDATA[转义的内容为<name>]]>
</其他说明>
<m>
<随便放1></随便放1>
<随便放2></随便放2>
<随便放3></随便放3>
</m>
<n></n>
<o>
<z></z>
</o>
</人>
a.dtd
<!ELEMENT 人 (国家+,其他国家,其他说明,m,n,o)>
<!ELEMENT 国家 (姓名,年龄)>
<!ATTLIST 国家 value ID #REQUIRED>
<!ATTLIST 国家 首都 CDATA #REQUIRED>
<!ATTLIST 国家 人口 CDATA #IMPLIED>
<!ATTLIST 国家 所属星球 CDATA #FIXED "地球">
<!ATTLIST 国家 所属星系球 CDATA "太阳系">
<!ATTLIST 国家 世界经济排名 (第一|第二|第三) "第一">
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 其他国家 EMPTY>
<!ELEMENT 其他说明 (#PCDATA)>
<!ELEMENT m ANY>
<!ELEMENT n EMPTY>
<!ELEMENT o ((x*, y?, z)* | p)>
<!ELEMENT x (#PCDATA)>
<!ELEMENT y (#PCDATA)>
<!ELEMENT z (#PCDATA)>
<!ELEMENT p (#PCDATA)>
注:现阶段dtd用的不多,主要用的是Schea,有替代dtd之意
解析XML主要有两种思想:dom和sax
JDK自带解析方式(SAX)简介:
B.xml
<?xml version="1.0" encoding="UTF-8"?>
<test>
<a name="a">
<a1>a1</a1>
<a2>a2</a2>
<a3>a3</a3>
</a>
<b name="b"/>
<c>
<c1 name="c1">c1</c1>
</c>
</test>
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 SAX {
public static void main(String[] args) throws Exception {
//1.获取解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//2.通过工厂获取sax解析器
SAXParser parser = factory.newSAXParser();
//3.获取读取器
XMLReader reader = parser.getXMLReader();
//4.注册事件处理器
reader.setContentHandler(new MyContentHandler2());
//5.解析xml
reader.parse("B.xml");
}
}
//适配器设计模式
class MyContentHandler2 extends DefaultHandler{
@Override
public void startElement(String uri,String localName,String name,Attributes attributes) throws SAXException {
System.out.println(name);//开始标签
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String str = new String(ch,start,length);
if(!str.trim().equals("")){
System.out.println(str);
}
}
@Override
public void endElement(String uri, String localName, String name) throws SAXException {
System.out.println(name);//结束标签
}
}
class MyContentHandler implements ContentHandler{
public void startDocument() throws SAXException {
System.out.println("文档解析开始了.......");
}
public void startElement(String uri,String localName,String name,Attributes atts) throws SAXException {
System.out.println("发现了开始标签,"+name);
}
public void characters(char[] ch, int start, int length) throws SAXException {
System.out.println(new String(ch,start,length));
}
public void endElement(String uri, String localName, String name) throws SAXException {
System.out.println("发现结束标签,"+name);
}
public void endDocument() throws SAXException {
System.out.println("文档解析结束了.......");
}
public void endPrefixMapping(String prefix) throws SAXException {
// TODO Auto-generated method stub
}
public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
}
public void processingInstruction(String target, String data) throws SAXException {
// TODO Auto-generated method stub
}
public void setDocumentLocator(Locator locator) {
// TODO Auto-generated method stub
}
public void skippedEntity(String name) throws SAXException {
// TODO Auto-generated method stub
}
public void startPrefixMapping(String prefix, String uri) throws SAXException {
// TODO Auto-generated method stub
}
}
dom4j解析方式简介:
import java.io.FileOutputStream;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
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 DomTest {
private final static String URL = "B.xml";
public static void main(String[] args) throws Exception{
//1.获取解析器
SAXReader reader = new SAXReader();
//2.解析xml获取代表整个文档的dom对象
Document dom = reader.read(URL);
//3.获取根节点
Element root = dom.getRootElement();
//4.获取节点进行打印
String tag = root.element("a").element("a2").getText();
System.out.println(tag);
}
@Test
public void find() throws Exception{
SAXReader reader = new SAXReader();
Document dom = reader.read(URL);
Element root = dom.getRootElement();
List<Element> list = root.elements();
Element subEle = list.get(2);
System.out.println(subEle.element("c1").getText());
}
@Test
public void add()throws Exception{
SAXReader reader = new SAXReader();
Document dom = reader.read(URL);
Element root = dom.getRootElement();
Element newEle = DocumentHelper.createElement("c2");
newEle.setText("c2");
Element upEle = root.element("c");
upEle.add(newEle);
//将内存中的dom树会写到xml文件中,从而使xml中的数据进行更新
//FileWriter writer = new FileWriter(URL);
//dom.write(writer);
//writer.flush();
//writer.close();
XMLWriter writer = new XMLWriter(new FileOutputStream(URL),OutputFormat.createPrettyPrint());
writer.write(dom);
writer.close();
}
@Test
public void update()throws Exception{
SAXReader reader = new SAXReader();
Document dom = reader.read(URL);
Element root = dom.getRootElement();
root.element("a").element("a1").setText("a4");
XMLWriter writer = new XMLWriter(new FileOutputStream(URL),OutputFormat.createPrettyPrint());
writer.write(dom);
writer.close();
}
@Test
public void del() throws Exception{
SAXReader reader = new SAXReader();
Document dom = reader.read(URL);
Element root = dom.getRootElement();
Element subEle = root.element("c").element("c2");
subEle.getParent().remove(subEle);
XMLWriter writer = new XMLWriter(new FileOutputStream(URL),OutputFormat.createPrettyPrint());
writer.write(dom);
writer.close();
}
@Test
public void attr() throws Exception{
SAXReader reader = new SAXReader();
Document dom = reader.read(URL);
Element root = dom.getRootElement();
Element subEle = root.element("c");
subEle.addAttribute("key", "value");
//String str = subEle.attributeValue("key");//value
//System.out.println(str);
Attribute attr = subEle.attribute("key");
attr.getParent().remove(attr);
XMLWriter writer = new XMLWriter(new FileOutputStream(URL),OutputFormat.createPrettyPrint());
writer.write(dom);
writer.close();
}
}
另:其实W3C是个学习的好地方,可以在那里学习到DTD、XmlSchema、XPATH等等