XML DOM (XML Document Object Model) 定义了访问和操作 XML 文档的标准方法,是 W3C(万维网联盟) 的推荐标准。 DOM 把 XML 文档作为树结构来查看。能够通过 DOM 树来访问所有元素。可以修改或删除它们的内容,并创建新的元素。元素,它们的文本,以及它们的属性,都被认为是节点。
名称解释 - 节点
XML 文档中的每个成分都是一个节点(Node),DOM 是这样规定的:
整个文档是一个文档节点
每个 XML 标签是一个元素节点
包含在 XML 元素中的文本是文本节点
每一个 XML 属性是一个属性节点
注释属于注释节点
在上面的 XML 中,根节点是 <bookstore>,文档中的所有其他节点都被包含在 <bookstore> 中。根节点有四个 <book> 节点,第一个 <book> 节点有四个节点:<title>, <author>, <year>, <price>,其中每个节点都包含一个文本节点:"Harry Potter", "J K. Rowling", "2005", "29.99"。
注意:在 DOM 处理中一个普遍的错误是,认为元素节点包含文本。实际上元素是一个节点,文本是另外一个节点;只不过,元素节点的文本是存储在文本节点中的。
XML DOM 把 XML 文档视为一种树结构,这种树结构被称为节点树 (node-tree)。可通过这棵树访问所有节点,可以修改或删除它们的内容,也可以创建新的元素。 节点树中的节点彼此之间都有等级关系,父、子和同级节点用于描述这种关系。父节点拥有子节点,位于相同层级上的子节点称为同级节点(兄弟或姐妹)。
在节点树中,顶端的节点成为根节点
根节点之外的每个节点都有一个父节点
节点可以有任何数量的子节点
叶子是没有子节点的节点
同级节点是拥有相同父节点的节点
因为 XML 数据是按照树的形式进行构造的,所以可以在不了解树的确切结构且不了解其中包含的数据类型的情况下,对其进行遍历。
privatevoidtraverseNodeTree(final Node node){ NodeList childLists = node.getChildNodes(); for (int i = 0; i < childLists.getLength(); i++){ Node child = childLists.item(i); // only show element node info. if (child.getNodeType() == Node.ELEMENT_NODE){ int length = child.getChildNodes().getLength(); if (length > 1){ // length > 1, there is more than one text content. // It's mean there are some child element nodes. showNodeInfo(child, false); traverseNodeTree(child); }else { // length == 0, there is no text content. // length == 1, there is one text content showNodeInfo(child, true); } } } }
/** * 显示节点对应的元素,属性,文本 * @param node:节点 */ privatevoidshowNodeInfo(final Node node, boolean showTextContent){ String name = node.getNodeName(); StringBuilder attributes = new StringBuilder(""); NamedNodeMap namedNodeMap = node.getAttributes(); if (namedNodeMap != null && namedNodeMap.getLength() > 0){ for (int i = 0; i < namedNodeMap.getLength(); i++) { Node attributeNode = namedNodeMap.item(i); attributes.append(attributeNode.toString()); attributes.append(" ");
// show attribute name and value, eg: // app:color="?unknown_attr_ref: 1010038" // attribute name is -> app:color // attribute value is -> ?unknown_attr_ref: 1010038 // System.out.println("attribute.name = " + attributeNode.getNodeName() // + ", attribute.value = " + attributeNode.getNodeValue()); } } String textContent = node.getTextContent();
StringBuilder info = new StringBuilder(); info.append("name-> " + name); if (!attributes.toString().isEmpty()){ info.append("| attributes-> " + attributes); } if (showTextContent && textContent != null && !textContent.isEmpty()){ info.append("| textContent-> " + textContent); } System.out.println(info); }