`
QuarterLifeForJava
  • 浏览: 176315 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

XML基础知识

    博客分类:
  • XML
xml 
阅读更多
申明:内容大多来自传智播客黑马
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&amp;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等等
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics