XML的解析
1.常用的XML解析方式:DOM和SAX
a)DOM:Document ObjectModel,文档对象模型,非常适合增删改查(CRUD)
是W3C推荐的使用的解析方式
b)SAX:Simple APIfor XML:只能进行查询操作,节省内存。非官方标准
2.常用的解析开发包:JAXP,Dom4j,JDom
3.无论是何种解析方式,首先是你先得到Document对象,然后得到Elment对象,一般Element对象是通过Document对象来获得的。SAX例外
4.要严格区分XML文档树中的根结点与根元素结点:
a) 根结点(Document)代表的是XML文档本身,是我们解析XML文档的入口
b) 而根元素结点则表示XML文档的根元素,它对应于XML文档的Root。
JAXP解析
1.JAXP(Java API forXML Parsing):SUN推出的实现,能实现DOM和SAX方式解析XML.。
2.JAXP的API都在JavaSe中,
a)org.w3c.dom:提供DOM方式解析XML的标准接口
b)org.xml.sax:提供SAX方式解析XML的标准接口
c)javax.xml:提供了解析XML文档的类
JAXP进行DOM解析
1.对于XML应用开发来说,DOM就是一个对象化的XML数据接口,一个与语言无关,与平台无关的标准接口规范。
2.一切皆节点:即整个XML文档的每个XMl的结构都是节点,XML文档本身也是一个节点,节点包括XML文档,属性(Attr),元素(Element),CharacterData节点的子类文本(Text)节点和注释节点。DOM就是一个树形结构,如下图:
3.XML文件读入的方式:
//获得DocumentBuilderFactory解析器工厂对象
DocumentBuilderFactory factory=newDocumentBuilderFactory();
//获得DocumentBuilder解析器对象
DocumentBuilder builder=factory.newDocumentBuilder();
//获得XML的整个文档对象
Document document=builder.parse(@xml文档);
注:@XMl文档可以是字符串,可以是File对象,URL对象,InputStream对象
4.一个XML文档里可能有很多相同名字节点,通过Documen对象的getElementTagName()方法得到NodeList对象,再通过NodeList的item(index)选择你要操作第index个元素节点。item(index)方法返回的是节点对象,这个节点对象如果含有元素,就可以对元素进行增删改查操作。Document对象常见方法如下
5.要想获得具体的节点,先得到Node对象,再强制转换为具体的节点对象。
比如我要操作Element节点,首先将Node强制转换为Element,再通过Element节点来操作元素里面的属性和设置文本内容。
例如:Element ele=(Element)node;
6.元素对象(Element)可以对属性进行增删改查。
6.将XMl写入到xml文档:
TransformerFactorytransfactory=TransformerFactory.newInstance();
Transformertrans=transfactory.newTransformer();
trans.transform(newDOMSource(doc),new StreamResult("temp\\test.xml"));
SAX解析
1.SAX(Simple APIs for XML),面向XML的简单APIs ,SAX使用的观察者模式中的设计模式(类似于GUI中事件)。
2.通过读取器读取XMl文档,当读到了文档的某一部分是(文档的开是,元素的开始,,文本,元素的结束,文档的结束),都会调用事件处理器的对应方法,读到的数据,以参数的形式传递给对应的方法。
3.SAX的结构原理图如下:
4.SAX的基本创建过程:
//获得SAX的解析工厂 SAXParserFactory factory=SAXParserFactory.newInstance(); //获得SAX解析器 SAXParser parser=factory.newSAXParser(); //得到XML的读取流 XMLReader reader=parser.getXMLReader(); //添加事件处理机制 reader.setContentHandler(new DefaultHandler(){ //文档每个元素的开始处 @Override public void startElement(String uri,String localName, String qName,Attributes attributes)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)); } //文档每个元素的结束 @Override public void endElement(String uri,String qName) throws SAXException { System.out.println(qName); } }); //要解析的xml文档 reader.parse("src//exam.xml"); |
5.使用SAX解析的好处:使用DOM解析XML时,首先将XML文档加载到内存当中,然后可以通过随机的方式访问内存中的DOM树;SAX是基于事件而且是顺序执行的,一旦经过了某个元素,我们就没有办法再去访问它了,SAX不必事先将整个XML文档加载到内存当中,因此它占据内存要比DOM小,对于大型的XML文档来说,通常会使用SAX而不是DOM进行解析。
Dom4j解析
1.它兼具了dom和sax的优点。查询速度快,增删改速度快。具有方法链编程风格(method chain style)
2.XML文档的基本创建过程:
//获得Document对象
SAXReader reader=newSAXReader();
Documentdocument=reader.read("stu.xml");
//通过Document对象获得根元素
Element rootElement=document.getRootElement();
3.通过元素对象(包括根元素)来获得它下面的子元素的操作:
a)获得该元素下第一个子元素:element();
b)返回该元素下面全部的子元素,该方法返回的是一个List集合,我们可以通过List容器的增删改查方法来对元素进行操作,也可以使用List的Iterator来遍历List容器中所有的Elment对象:elements();
c)返回该元素下所有指定的子元素:elements(String name).
a)添加指定的属性,并给属性指定对应的值:addAttrbute(String name,String value);
b)元素所包含的属性的数量,返回的是int类型:attrbuteCount();
c)返回指定的属性的属性值,返回的是String类型:attrbuteValue(String name);
d)获得元素中所有的属性集合,返回的是List类型:attrbutes()
5.通过元素来对元素的文本内容今昔操作:
b)获得元素的文本内容:getText();
c)获得指定元素的文本内容:elementText(String tagname);
6.创建一个XML文档,元素,属性,就需要使用DocumentHelp对象了:
a)创建一个指定的根元素的XML文档对象,返回的是Document对象:createDocument(Element rootElement)
b)创建一个给定的字符串的XML文本内容,将会返回新的Document对象:
Document parseText(String text)
c)创建一个指定名称的新元素,返回的是Element对象:createElement();
d)创建一个指定的元素,属性名,属性值的属性(Attrbute)对象:
createAttribute(Element owner,QName qname,String value);
7.将XML文档或者Element元素对象变成字符串:
asXML()方法:通过Document对象或者Element对象的引用,调用该方法。该Document或者是Element将会以字符串的表现形式表现。
8.如何将增删改后的XML文档重新保存呢?
OutputStream out=newFileOutputStream(path);
OutputFormatformat=OutputFormat.createPrettyPrint();
XMLWriterwriter=new XMLWriter(out,format);
writer.write(doc);
writer.close();
这里的OutputFormat对象注意一下两个静态方法:
a)createCompactFormat():保存完后的XML文档,是没有格式的,没有空格和换行,该方法是默认的创建方式,一般用在网页传输数据时,节省数据内存。
b)createPrettyPrint():保存完后的XML文档,具有格式美好的,有空格,有换行,但占用内存比较大,一般不用于网络之间的传输。
c)setEncoding(String encoding):设置XML文档的编码格式
9.Dom4j的XPath解析:是通过特殊的符号直接定位到我想要找的内容:
如:Node node = document.selectSingleNode(String xpath);
xpath就是定义的规则,找到后获得Node对象,可以强转成Element对象,再通过元素对象可以进行下一步的增删改查动作。
a)selectSingleNode(String xpath)方法:通过Xpath规则,来获得元素节点对象。
b)valueof(String xpath):通过Xpath规则,来获得相应类型的属性值
例如使用的过程如下:
SAXReaderreader=new SAXReader();
Document document = reader.read(“demo.xml”);
//省去了根元素的获取,直接通过Xpath规则的属性规则获得指定的元素节点
Node node =document.selectSingleNode("//student[@examid=123']");
//将Node对象强制转换成Element对象
Element e = (Element)node;
//获得该Element对象的另一个属性值:
int value=valueOf(“@cardid”);
//获得该元素下的子元素
Elementchild=e.element(“name”);