XML包含的知识有:1.xml--可扩展的标记语言2.xsl(xslt)--对xml进行转化,如:xml--html3.dtd(schema)--规定xml可以使用什么标签四种解析XML的方式:DOMSAXJDOMDOM4J//xpathListNodelist=document.selectNodes(/xx/xx/xx);for(Noden:list){System.out.println(n.getName());Stringname=n.valueOf(@name);}dom4j(org.dom4j.xxx)1.接口继承关系interfacejava.lang.Cloneableinterfaceorg.dom4j.Nodeinterfaceorg.dom4j.Attributeinterfaceorg.dom4j.Branchinterfaceorg.dom4j.Documentinterfaceorg.dom4j.Elementinterfaceorg.dom4j.CharacterDatainterfaceorg.dom4j.CDATAinterfaceorg.dom4j.Commentinterfaceorg.dom4j.Textinterfaceorg.dom4j.DocumentTypeinterfaceorg.dom4j.Entityinterfaceorg.dom4j.ProcessingInstruction2.读取并解析XML文档//从文件(或字符串)读取XML,输入文件名,返回XML文档publicDocumentread(StringtextXML)throwsMalFormedURLException,DocumentException{SAXReaderreader=newSAXReader();//1.读取文件Documentdocument=reader.read(newFile(textXML));//2.读取字符串1Documentdocument=reader.read(newByteArrayInputStream(textXML.getBytes(UTF-8)));//3.读取字符串2//importorg.dom4j.DocumentHelper;Documentdocument=DocumentHelper.parseText(textXML);returndocument;}其中,reader的read方法是重载的,可以从InputStream,File,Url等多种不同的源读取,得到的Document对象就代表了整个XML。3.取得root节点//熟悉XML的人都知道,一切XML分析都是从root元素开始的publicElementgetRootElement(Documentdoc){returndoc.getRootElement();}4.遍历XML树//枚举所有子节点(只包括一级子节点)for(Iteratori=root.elementIterator();i.hasNext();){Elementelement=(Element)i.next();//dosomething}//枚举名称为foo的节点for(Iteratori=root.elementIterator(foo);i.hasNext();){Elementfoo=(Element)i.next();//dosomething}5.XPath访问一个节点dom4j对XPath有良好的支持,如访问一个节点,可直接用XPath选择//返回所有的/foo/bar节点ListElementlist=document.selectNodes(/foo/bar);//然后遍历这个listfor(Iteratoriter=list.iterator();iter.hasNext();){Elementnext=iter.next();StringnodeName=next.getName();//获取节点名称StringnewNodeName=next.setName();//设置节点名称StringnodeValue=next.getValue();//获取节点值StringnewNodeValue=next.setValue();//设置节点值}//返回与之匹配的第一个节点Nodenode=document.selectSingleNode(/foo/bar);在这里说下Node和Element的区别:Alarmlock=true//nodeTime//nodeStringValue//node/Time//node/Alarm//node以上Alarm(元素节点),lock(属性节点),Time(元素节点),StringValue(文本节点)都是Node,但是只有Alarm....../Alarm和TimeStringValue/Time是Elementxmlelement是继承于node,除了element之外,还有XmlAttribute、XmlText等。通过某些方法可能可以得到某个值,可能是element、attribute、xmlText等,如果你不确定,则可以使用node来做返回值的类型。node只是具有了一些通用的方法,而element则具有更具体的功能。6.字符串与XML的转换//XML转字符串Stringtext=document.asXML();//字符串转XMLStringtext=James;Documentdocument=DocumentHelper.parseText(text);dom(org.w3c.dom)--模式解析XML,是把整个XML文档当成一个对象来处理,会先把整个文档读入到内存里,是基于树的结构,通常需要加装整个文档和构造dom树,然后才能开始工作2.优缺点优点:由于整棵树在内存中,因此可以对xml文档随机访问;可以对xml文档进行修改操作。缺点:整个文档必须一次性解析完;由于整个文档都需要载入内存,对于大文档成本高。3.获取文档对象(DocumentBuilderFactory→DocumentBuilder→Document)//a.解析器工厂类DocumentBuilderFactoryDocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();//b.解析器DocumentBuilderDocumentBuilderdb=dbf.newDocumentBuilder();//c获取文档对象Document//第一种方法:通过xml文档Documentdoc=db.parse(bean.xml);//第二种方法:通过字符串InputStreamstrm=newByteArrayInputStream(srcXml.getBytes(charset));Documentdoc=db.parse(strm);4.获取根元素Elementelement=doc.getDocumentElement();5.获取节点集合及遍历NodeListnList=element.getElementByTagName(person);for(inti=0;inList.getLength();i++){ElementpersonEle=(Element)nList.item(i);}6.获取一个节点的子节点集合及遍历NodeListchild=peson.getChildNodes();for(intj=0;jchild.getLength();j++){Elemente=(Element)child.item(j);Stringcontent=e.getTextContent();//获取元素内容e.getElementsByTagName(name).item(0).setTextContent(xxx);//设置元素内容}7.document对象转换为字符串publicstaticStringdoc2String(Documentdoc){try{Sourcesource=newDOMSource(doc);StringWriterstringWriter=newStringWriter();Resultresult=newStreamResult(stringWriter);TransformerFactoryfactory=TransformerFactory.newInstance();Transformertransformer=factory.newTransformer();transformer.setOutputProperty(OutputKeys.INDENT,yes);transformer.transform(source,result);returnstringWriter.getBuffer().toString();}catch(Exceptione){returnnull;}}