XML教程——采用DOM来解析XML
?
回页首
解析文档的三步过程
为了使用 XML 文件中的信息,必须解析该文件以创建 Document 对象。
Document 对象是一个接口,所以不能直接实例化;相反,应用程序一般使用 factory。确切的过程随实现的不同而不同,但想法是相同的。在示例 JAXP 环境中,解析文件是一个三步过程:
如果需要,在不必更改代码的情况下,JAXP 允许插进不同的解析器。让我们继续,开始构建应用程序。
回页首
基本的应用程序
从创建基本的应用程序,名为 OrderProcessor 的类开始。
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.File; import org.w3c.dom.Document; public class OrderProcessor { public static void main (String args[]) { File docFile = new File("orders.xml"); Document doc = null; try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); doc = db.parse(docFile); } catch (Exception e) { System.out.print("Problem parsing the file."); } } }
?
首先,Java 导入必要的类,然后创建 OrderProcessor 应用程序。在本教程中的这个示例将只处理一个文件,所以为简短起见,该应用程序包含对它的直接引用。
应用程序在 try-catch 块外部定义了 Document 对象,以便在后面使用该对象。try-catch 使您能执行可能会抛出异常的一些操作,这样不会危及整个应用程序。如果异常抛出,则应用程序简单地执行相应的 catch 代码。
在 try-catch 块内部,应用程序创建 DocumentBuilderFactory,然后使用它来创建 DocumentBuilder。最后,DocumentBuilder 解析该文件以创建 Document。
回页首
DOM 常用方法
回页首
编辑文档
Node.setNodeValue(elemValue);
String totalString = new Double(total).toString(); Node totalNode = doc.createTextNode(totalString); //Document 对象创建新的文本节点,该节点带有作为值的 totalStringElement totalElement = doc.createElement("total"); //创建新元素 totaltotalElement.appendChild(totalNode);// 将节点添加到新的 total 元素。thisOrder.insertBefore(totalElement, thisOrder.getFirstChild()); //将新元素添加到 Document,指定新的 Node,然后指定新 Node 在 Node 之前
Node deadNode = thisOrderItem.getParentNode().removeChild(thisOrderItem);
Element backElement = doc.createElement("backordered");//创建新元素 backorderedNode deadNode = thisOrderItem.getParentNode().replaceChild(backElement,thisOrderItem);
Element backElement = doc.createElement("backordered");//创建新元素 backorderedbackElement.setAttributeNode(doc.createAttribute("itemid"));//创建新属性 itemidString itemIdString = thisOrderItem.getAttributeNode("itemid").getNodeValue();//取得thisOrderItem的属性itemid的值backElement.setAttribute("itemid", itemIdString);//设置backElement的属性item的值,可以省略createAttributeNode deadNode = thisOrderItem.getParentNode().replaceChild(backElement,thisOrderItem);
Element thisOrder = (Element)orders.item(orderNum);Element customer = (Element)thisOrder.getElementsByTagName("cusomertid").item(0);customer.removeAttribute("limit");//去除属性limit