XML相关
大学时的笔记,整理一下,有关XML及相关操作的。 Axml实体引用 & & ' ' > > < < " "B dom技术 1.访问相关节点 <html> <head> <title>DOM Example</title> </head> <body> <p>Hello World!</p> <p>Isn't this exciting!</p> <p>You're learning to use the DOM!</p> </body> </html> 访问<html/>元素: var oHtml = document.documentElement; 取得<head/>元素: var oHead = oHtml.firstChild; / var oHead = oHtml.childNodes[0]; / var oHead = oHtml.childNodes.item(0); 取得<body/>元素: var oBody = document.body; var oBody = oHtml.lastChild; / var oBody = oHtml.childNodes[1]; / var oBody = oHtml.childNodes.item(1); 取得子节点数量: var length = oHead.childNodes.length; 确定<html/> <head/> <body/>之间的关系: alert(oHead.parentNode == oHtml); //outputs "true" alert(oBody.parentNode == oHtml); //outputs "true" alert(oHead.nextSubling == oBody); //outputs "true" alert(oBody.previousSubling == oHead); //outputs "true" alert(oHead.ownerDocument == document); //outputs "true" 2.处理特性 <p style="color:red" id="p1">Hello world!</p> 获取id特性值: var oP = document.getElementById("p1"); var sId = oP.getAttribute("id"); 或 var sId = oP.attributes.getNamedItem("id").nodeValue; 或 var sId = oP.attributes.item(1).nodeValue; 设置id特性值: var oP = document.getElementById("p1"); oP.setAttribute("id") = "newId"; oP.attributes.getNamedItem("id").nodeValue = "newId"; oP.attributes.item(1).nodeValue = "newId"; 3.访问指定节点 3.1)XML DOM的getElementByTagName(); 获取文档中第3个img元素: var oImgs = document.getElementByTagName("img"); var oneImg = oImgs[2];或 var oneImg = oImgs.item(2); 获取页面第一段落的所有图像: var oP = document.getElementByTagName("p").item(0); var oImgs = oP.getElementByTagName("img"); 3.2)HTML DOM的getElementByName(); <html> <head>DOM Example</head> <body> <form method="post" action="dosomething.cgi"> <fieldset> <legend>What color do you like?</legend> <input type="radio" name="radColor" value="red"/>Red<br/> <input type="radio" name="radColor" value="Green"/>Green<br/> <input type="radio" name="radColor" value="Blue"/>Blue<br/> </fieldset> </form> </body> </html> 获得所有单选按钮的引用:var oRadios = document.getElementByName("radColor"); 获得单个单选按钮的颜色:alert(oRadios[0].getArrribute("value")); //outputs "Red" 3.3)HTML DOM的getElementById() <html> <head>DOM Example</head> <body> <p>Hello World!</p> <div id="div1">This is my first layer</div> </body> </html> 访问id为"div1"的</div>元素: HTML DOM var oDiv1 = document.getElementById("div1"); / XML DOM var oDivs = document.getElementByTagName("div"); var oDiv1 = null; for(int i=0; i<oDivs.length; i++){ if(oDivs[i].getAttribute("id") == "div1"){ oDiv1 = oDivs[i]; break; } } 4创建和操作节点 假设有如下页面: <html> <head> <title>createElement() Example</title> </head> <body> </body> </html> 4.1)createElement()、createTextNode()、appendChild() 使用DOM添加<p>Hello World!</p>到这个页面中: <html> <head> <title>createElement() Example</title> <script type="text/javascript"> function createMessage(){ var oP = document.createElement("p"); var oText = document.createTextNode("Hello World!"); oP.appendChild(oText); document.body.appendChild(oP); } </script> </head> <body onload="createMessage()"> </body> </html> 4.2)removeChild() 假设已有一个包含Hello World!消息的页面. 移除消息: <html> <head> <title>removeChild() Example</title> <script type="text/javascript"> function removeMessage(){ var oPs = document.getElementByTagName("p"); var oP = oPs[0]; oP.parentNode.removeChild(oP) } </script> </head> <body onload="removeMessage()"> <p>Hello World!</p> </body> </html> 4.3)replaceChild() 假设已有一个包含Hello World!消息的页面. 用<p>Hello Universe!</p>替换消息: <html> <head> <title>replaceChild() Example</title> <script type="text/javascript"> function replaceMessage(){ var oNewP = document.createElement("p"); var oText = document.createTextNode("Hello Universe!"); oNewP.appendChild(oText); var oOldP = document.getElementByTagName("p")[0]; oOldP.parentNode.replaceChild(oNewP,oOldP); } </script> </head> <body onload="replaceMessage()"> <p>Hello World!</p> </body> </html> 4.4)insertBefore() 假设已有一个包含Hello World!消息的页面. 让<p>Hello Universe!</p>出现在此消息之前: <html> <head> <title>insertBefore() Example</title> <script type="text/javascript"> function insertMessage(){ var oNewP = document.createElement("p"); var oText = document.createTextNode("Hello Universe!"); oNewP.appendChild(oText); var oOldP = document.getElementByTagName("p")[0]; oOldP.parentNode.insertBefore(oNewP,oOldP); } </script> </head> <body onload="replaceMessage()"> <p>Hello World!</p> </body> </html> 4.5)createDocumentFragment() 一次刷屏代替多次刷屏 var arrText = ["first","second","third","fourth","fifth"]; var oFragment = document.createDocumentFragment(); for(var i=0;i<arrText.length;i++){ var oP = document.createElement("p"); var oText = document.createTextNode(arrText[i]); oP.appendChild(oText); oFragment.appendChild(oP); } document.body.appendChild(oFragment.appendChild(oFragment)); 这里对appendChild()的调用实际上并不是把文档碎片节点本身追加到</body>元素中;而是仅仅追加碎片中的子节点。 调用document.body.appendChild()一次代替十次,这意味着只需要进行一次刷屏. 5 HTML DOM特征功能 5.1)让特性像属性一样 <img src="mypicture.jpg" border="0"/> 使用XML DOM获取和设置src和border特性,要用getAttribute()和setAttribute()方法: alert(oImg.getAttribute("src")); alert(oImg.getAttribute("border")); oImg.setAttribute("src","mypicture2.jsp") oImg.setAttribute("border","1"); 使用HTML DOM,可以使用同样名称的属性来获取和设置这些值: alert(oImg.src); alert(oImg.border); oImg.src="mypicture2.jsp"; oImg.border="1"; 特性名和属性名不一样的特例:(因为class是个保留字) <div class="header"></div> alert(oDiv.className); oDiv.className="footer"; 注:IE在setAttribute()上有个很大的问题,当你使用它时,变更并不会总是正确地反应出来。如果使用IE,最好尽可能用属性 5.2)table方法 假设想使用DOM来创建如下HTML表格: <table border="1" width="100%"> <tbody> <tr> <td>Cell 1,1</td> <td>Cell 1,2</td> </tr> <tr> <td>Cell 2,1</td> <td>Cell 2,2</td> </tr> </tbody> </table> 通过XML DOM完成: //create the table var oTable = document.createElement("table"); oTable.setAttribute("border","1"); oTable.setAttribute("width","100%"); //create the tbody var oTBody = document.createElement("tbody"); oTable.appendChild(oTBody); //create the first row var oTR1 = document.createElement("tr"); oTBody.appendChild(oTR1); var oTD11 = document.createElement("td"); oTD11.appendChild(document.createTextNode("Cell 1,1")); oTR1.appendChild(oTD11); var oTD12 = document.createElement("td"); oTD12.appendChild(document.createTextNode("Cell 1,2")); oTR1.appendChild(oTD12); //create the second row var oTR2 = document.createElement("tr"); oTBody.appendChild(oTR2); var oTD21 = document.createElement("td"); oTD21.appendChild(document.createTextNode("Cell 2,1")); oTR2.appendChild(oTD21); var oTD22 = document.createElement("td"); oTD22.appendChild(document.createTextNode("Cell 2,2")); oTR2.appendChild(oTD22); //add the table to the document body document.body.appendChild(oTable); 这段代码十分冗长且有些难以理解。 为了协助建立表格,HTML DOM给<table/>、<tbody/>和</tr>添加了一些特性和方法 通过HTML DOM完成: //create the table var oTable = document.createElement("table"); oTable.border = "1"; oTable..width = "100%"; //create the body var oTBdoy = document.createElement("tbody"); oTable.appendChild(oTBody); //create the first row oTBody.inserRow(0); oTBody.rows[0].inserCell(0); oTBody.rows[0].cells[0].appendChild(document.createTextNode("Cell 1,1")); oTBody.rows[0].inserCell(1); oTBody.rows[0].cells[1].appendChild(document.createTextNode("Cell 1,2")); //create the second row oTBody.inserRow(1); oTBody.rows[1].inserCell(0); oTBody.rows[1].cells[0].appendChild(document.createTextNode("Cell 2,1")); oTBody.rows[1].inserCell(1); oTBody.rows[1].cells[1].appendChild(document.createTextNode("Cell 2,2")); //add the table to the document body document.body.appendChild(oTable); 虽然从技术角度来说,两种代码都是正确的, 但是使用这些特性和方法来创建表格使得代码变得更加有逻辑且更加易读 参考文档: http://www.iteye.com/topic/335626 C dom4J的使用
// 从文件读取XML,输入文件名,返回XML文档 public Document read(String fileName) throws MalformedURLException,DocumentException { SAXReader reader = new SAXReader(); Document document = reader.read(new File(fileName)); return document; }2 取得 Root 节点
public Element getRootElement(Document doc){ return doc.getRootElement(); }3 遍历 XML 树
1) 枚举(Iterator) // 枚举所有子节点 for ( Iterator i = root.elementIterator(); i.hasNext(); ) { Element element = (Element) i.next(); // do something } // 枚举名称为foo的节点 for ( Iterator i = root.elementIterator(foo); i.hasNext();) { Element foo = (Element) i.next(); // do something } // 枚举属性 for ( Iterator i = root.attributeIterator(); i.hasNext(); ) { Attribute attribute = (Attribute) i.next(); // do something } 2)递归 public void treeWalk() { treeWalk(getRootElement()); } public void treeWalk(Element element) { for (int i = 0,size = element.nodeCount(); i < size; i++) { Node node = element.node(i); if (node instanceof Element) { treeWalk((Element) node); } else { // do something.... } } } 3) Visitor模式 public class MyVisitor extends VisitorSupport { public void visit(Element element){ System.out.println(element.getName()); } public void visit(Attribute attr){ System.out.println(attr.getName()); } } root.accept(new MyVisitor())
4. XPath支持 DOM4J对XPath有良好的支持,如访问一个节点,可直接用XPath选择。 public void bar(Document document) { List list = document.selectNodes( //foo/bar ); Node node = document.selectSingleNode(//foo/bar/author); String name = node.valueOf( @name ); } 例如,如果你想查找XHTML文档中所有的超链接,下面的代码可以实现: public void findLinks(Document document) throws DocumentException { List list = document.selectNodes( //a/@href ); for (Iterator iter = list.iterator(); iter.hasNext(); ) { Attribute attribute = (Attribute) iter.next(); String url = attribute.getValue(); } } 5字符串与XML的转换 有时候经常要用到字符串转换为XML或反之, // XML转字符串 Document document = ...; String text = document.asXML(); // 字符串转XML String text = <person> <name>James</name> </person>; Document document = DocumentHelper.parseText(text);6 用XSLT转换XML
public Document styleDocument( Document document,String stylesheet ) throws Exception { // load the transformer using JAXP TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer( new StreamSource( stylesheet ) ); // now lets style the given document DocumentSource source = new DocumentSource( document ); DocumentResult result = new DocumentResult(); transformer.transform( source,result ); // return the transformed document Document transformedDoc = result.getDocument(); return transformedDoc; }7 创建XML
public Document createDocument() { Document document = DocumentHelper.createDocument(); Element root = document.addElement(root); Element author1 = root .addElement(author) .addAttribute(name,James) .addAttribute(location,UK) .addText(James Strachan); Element author2 = root .addElement(author) .addAttribute(name,Bob) .addAttribute(location,US) .addText(Bob McWhirter); return document; }8 文件输出
一个简单的输出方法是将一个Document或任何的Node通过write方法输出 FileWriter out = new FileWriter( foo.xml ); document.write(out); 如果你想改变输出的格式,比如美化输出或缩减格式,可以用XMLWriter类 public void write(Document document) throws IOException { // 指定文件 XMLWriter writer = new XMLWriter( new FileWriter( output.xml ) ); writer.write( document ); writer.close(); // 美化格式 OutputFormat format = OutputFormat.createPrettyPrint(); writer = new XMLWriter( System.out,format ); writer.write( document ); // 缩减格式 format = OutputFormat.createCompactFormat(); writer = new XMLWriter( System.out,format ); writer.write( document ); } 参考文档:http://xhy0422.iteye.com/blog/50235 参考文档: http://www.52php.cn/article/p-utbzmdwk-bhw.html 总结一下,本博客主要介绍了xml和dom相关知识以及如何用dom4j操作XML (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |