<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE classes SYSTEM "bin//parsers//java.dtd"> <classes> <java班 name="CSDNJava01班"> <teachers> <teacher name="军哥" sex="男" age="28" /> <teacher name="刘丽华" sex="女" age="28" /> </teachers> <students> <student id="x121"> <name>王亮</name> <sex>男</sex> <age>28</age> </student> </students> </java班> <!-- 注释 --> <net班 name="CSDNNet01班"> <teachers> <teacher name="Boss姚" sex="男" age="28" /> <teacher name="石老师" sex="女" age="28" /> </teachers> </net班> <PHP班 name="CSDNPHP01班"></PHP班> <ios班 name="CSDNIos01班"></ios班> </classes> <!-- 对java.xml文件进行CRUD的操作 --> <!-- 节点 nodeName nodeValue nodeType 名称 元素 element 标签 null 1 文本 text #text 文本值 3 属性 Attr 属性名 属性值 2 声明类型 10 注释 8-->
约束文件:
<!ELEMENT classes (java班,net班,PHP班,ios班)> <!ELEMENT java班 (teachers?,students?)> <!ELEMENT net班 (teachers?,students?)> <!ELEMENT PHP班 (teachers?,students?)> <!ELEMENT ios班 (teachers?,students?)> <!ELEMENT teachers (teacher*)> <!ELEMENT teacher EMPTY> <!ELEMENT students (student*)> <!ELEMENT student (name,sex,age)> <!ATTLIST java班 name CDATA #IMPLIED> <!ATTLIST net班 name CDATA #IMPLIED> <!ATTLIST PHP班 name CDATA #IMPLIED> <!ATTLIST ios班 name CDATA #IMPLIED> <!ATTLIST teacher name CDATA #IMPLIED> <!ATTLIST teacher sex CDATA #IMPLIED> <!ATTLIST teacher age CDATA #IMPLIED> <!ELEMENT name (#PCDATA)> <!ELEMENT sex (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ATTLIST student id ID #IMPLIED>
解析测试类:
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.junit.Test; import org.w3c.dom.Attr; 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; import org.xml.sax.SAXException; public class Dom { @Test public void test() throws ParserConfigurationException,SAXException,IOException { // 调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。 DocumentBuilderFactory builderFactory = DocumentBuilderFactory .newInstance(); // 调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。 DocumentBuilder builder = builderFactory.newDocumentBuilder(); // 解析指定的文件(返回Document对象) Document document = builder.parse(this.getClass().getClassLoader() .getResourceAsStream("parsers//java.xml")); // System.out.println(document + "-----"); // getInfo(document); //list(document); listNodes(document.getDocumentElement());//这是一种便捷属性,该属性允许直接访问文档的文档元素的子节点 // System.out.println("URI为:"+document.getDocumentURI()); } /** * 根据document对象获取一些相关的信息 * * @param document */ public void getInfo(Document document) { System.out.println("当前文件版本为:" + document.getXmlVersion()); System.out.println("DOCTYPE:" + document.getDoctype().getNodeType()); System.out.println("根标签:" + document.getDoctype().getName()); System.out.println("SYSTEMID:" + document.getDoctype().getSystemId()); } /** * 遍历文档 */ public void list(Document document) { // javaScript NodeList nodeList = document.getElementsByTagName(document.getDoctype() .getName()); for (int i = 0; i < nodeList.getLength(); i++) { // 获取指定的节点 Node node = nodeList.item(i); listNodes(node); // 节点是什么类型的节点 // System.out.println(node.getNodeType());// 返回整形 /* * if (node.getNodeType() == 1) {// 判断是否是元素节点 Element element = * (Element) node; NodeList listnode = * element.getChildNodes();//获取所有子元素 //遍历 for(int * j=0;j<listnode.getLength();j++){ Node nd=listnode.item(j); * listNodes(node); } } */ /* * if (node instanceof Element) { * System.out.println("node---------"); } */ } } /** * 遍历根据节点对象下面的所有的节点对象 * * @param node */ public void listNodes(Node node) { if (node.getNodeType() == Node.ELEMENT_NODE) {// 判断是否是元素节点 Element element = (Element) node; if (element.hasAttributes()) { NamedNodeMap namenm = element.getAttributes(); // 遍历 for (int k = 0; k < namenm.getLength(); k++) { Attr attr = (Attr) namenm.item(k); System.out.println("name:" + attr.getNodeName() + " value:" + attr.getNodeValue() + " type:" + attr.getNodeType()); } } NodeList listnode = element.getChildNodes();// 获取所有子元素 // 遍历 for (int j = 0; j < listnode.getLength(); j++) { Node nd = listnode.item(j); System.out.println("name:" + nd.getNodeName() + " value:" + nd.getNodeValue() + " type:" + nd.getNodeType()); listNodes(nd); } } } }
再来看看sax解析,在解析之前我们先来看看两者的区别:
<!DOCTYPE 四大名著[ <!ELEMENT 四大名著 (西游记,红楼梦)> <!ATTLIST 西游记 id ID #IMPLIED> ]> <四大名著> <西游记 id="x001"> <作者>吴承恩</作者> </西游记> <红楼梦 id="x002"> <作者>曹雪芹</作者> </红楼梦> </四大名著>
两种解析的方法(通过实现处理器接口,以及继承处理器的实现类):
import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.junit.Test; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SaxTest { @Test public void test() throws Exception{ //sax解析器工厂对象 SAXParserFactory factory=SAXParserFactory.newInstance(); //工厂对象 创建解析器对象 SAXParser saxParser=factory.newSAXParser(); //已学的几种模式 工厂模式 装饰模式 单例模式 saxParser.parse(new File("src//sax//sida.xml"),new MyDefaultHandler()); } class MyDefaultHandler extends DefaultHandler{ boolean isOk=false; @Override public void startDocument() throws SAXException { super.startDocument(); System.out.println("文档开始解析了。。。。。"); } @Override public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException { super.startElement(uri,localName,qName,attributes); if("作者".equals(qName)){ isOk=true; System.out.println("作者---开始"); } } @Override public void characters(char[] ch,int start,int length) throws SAXException { super.characters(ch,start,length); if(isOk){ System.out.println(new String(ch,length)); } } @Override public void endElement(String uri,String qName) throws SAXException { super.endElement(uri,qName); if("作者".equals(qName)){ System.out.println("作者---完毕"); isOk=false; } } @Override public void endDocument() throws SAXException { super.endDocument(); System.out.println("文档解析完毕了。。。。。"); } } }
import java.io.InputStream; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.junit.Test; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; public class SaxTest1 { @Test public void test() throws Exception{ //sax机械器工厂 SAXParserFactory factory=SAXParserFactory.newInstance(); //工厂对象 创建解析器对象 SAXParser saxParser=factory.newSAXParser(); XMLReader reader=saxParser.getXMLReader(); InputStream is=this.getClass().getClassLoader().getResourceAsStream("sax//sida.xml"); //设置解析的操作 reader.setContentHandler(new MyContentHandler()); //进行解析 reader.parse(new InputSource(is)); } class MyContentHandler implements ContentHandler{ boolean isOk=false; @Override public void setDocumentLocator(Locator locator) { } @Override public void startDocument() throws SAXException { System.out.println("文档开始解析了。。。。。"); } @Override public void endDocument() throws SAXException { System.out.println("文档解析完毕了。。。。。"); } @Override public void startPrefixMapping(String prefix,String uri) throws SAXException { // TODO Auto-generated method stub } @Override public void endPrefixMapping(String prefix) throws SAXException { // TODO Auto-generated method stub } @Override public void startElement(String uri,Attributes atts) throws SAXException { if("作者".equals(qName)){ isOk=true; System.out.println("作者---开始"); } } @Override public void endElement(String uri,String qName) throws SAXException { if("作者".equals(qName)){ isOk=false; System.out.println("作者---结束"); } } @Override public void characters(char[] ch,int length) throws SAXException { if(isOk){ System.out.println(new String(ch,length)); } } @Override public void ignorableWhitespace(char[] ch,int length) throws SAXException { // TODO Auto-generated method stub } @Override public void processingInstruction(String target,String data) throws SAXException { // TODO Auto-generated method stub } @Override public void skippedEntity(String name) throws SAXException { // TODO Auto-generated method stub } } }
效果:
1.startElement方法说明
1void startElement(String uri,
2String localName,
3String qName,
4Attributes atts)
5throws SAXException
6方法说明:
7解析器在XML 文档中的每个元素的开始调用此方法;对于每个 startElement 事件都将有相应的 endElement 事件(即使该元素为空时)。所有元素的内容都将在相应的endElement 事件之前顺序地报告。
8
9参数说明:
10uri - 名称空间URI,如果元素没有名称空间 URI,或者未执行名称空间处理,则为空字符串
11localName - 本地名称(不带前缀),如果未执行名称空间处理,则为空字符串
12qName - 限定名(带有前缀),如果限定名不可用,则为空字符串
13atts - 连接到元素上的属性。如果没有属性,则它将是空 Attributes 对象。在 startElement 返回后,此对象的值是未定义的
2.endElement方法说明
[java]view plaincopy
14void endElement(String uri,248)">1516StringqName)
17throws SAXException接收元素结束的通知。
18SAX 解析器会在XML 文档中每个元素的末尾调用此方法;对于每个 endElement 事件都将有相应的 startElement 事件(即使该元素为空时)。
19
20参数:
21名称空间URI,如果元素没有名称空间 URI,或者未执行名称空间处理,则为空字符串
22localName - 本地名称(不带前缀),如果未执行名称空间处理,则为空字符串
23限定的 XML 名称(带前缀),如果限定名不可用,则为空字符串
3.characters方法
java]view plaincopy
24void characters(char[] ch,248)">25int start,
26int length)
27 SAXException
28接收字符数据的通知,可以通过new String(ch,length)构造器,创建解析出来的字符串文本.
29参数:
30ch - 来自 XML文档的字符
31start - 数组中的开始位置
SAXParserFactoryspf =SAXParserFactory.newInstance();
SAXParsersp =spf.newSAXParser();
XMLReaderxmlReader =sp.getXMLReader();
xmlReader.setContentHandler(newBookParserHandler());
xmlReader.parse("book.xml");
希望对大家能有所帮助!