Dom解析XML

女爷i 2022-08-06 13:25 413阅读 0赞

DOM(Document Object Model):W3C组织推荐的处理XML的标准接口. http://www.w3.org/DOM/DOMTR.html DOM特点:首先将整个XML文档读取到内存中才能进行某些操作,如果XML文档很大,则会影响性能。 DOM结构模型: DOM的核心概念就是NODE(节点).DOM在分析XML文档时,将组成XML文档的各个部分(元素,属性,文本,注释,处理指令等)映射成一个对象,这个对象就叫做节点。在内存中这些节点形成一棵树。整棵树就是一个节点,树中的每一个节点也是一棵树。 DOM就是对这棵树的一个对象描述,我们通过访问树中的节点来存取XML文档的内容。 DOM解析器工厂:javax.xml.parsers.DocumentBuilderFactory 第一种使用其系统属性的方式: System.setProperty(“javax.xml.parsers.DocumentBuilderFactory”,”org.apache.xerces.jaxp.DocumentBuilderFactoryImpl”); 第二种使用其系统属性的方式: java -Djava.xml.parsers.DocumentBuilderFactory = oracle.xml.jaxp.JXDocumentBuilderFactory DOMTest 第三种方式: 如果不想使用JDK默认的解析器,比如使用apache的Xerces解析器,只需建立JRE\lib\endorsed目录,然后将xercesImpl.jar文件copy到其目录下。 DOM树中的节点类型: DOM本质上是节点的集合。由于一个文档中可能包含不同类型的信息,因此要定义不同类型的节点。XML中最常见的节点类型:文档,元素,文本,属性,其他不常用的节点类型包括:注释,处理指令,文档类型,CDATA段,文档片段,实体,实体引用,记号。 文档节点:文档树的根节点,也是文档中其他所有节点的父节点。但是不是根元素,因为XML文档中注释,处理指令等可以出现在根元素之外,所以在构造DOM树时,根元素并不适合作为根节点,于是就有了文档节点。根元素则作为文档节点的子节点。文档节点通过org.w3c.dom.Document接口来实现。 元素节点:XML文档中的元素。通常元素拥有子元素,文本节点或两者结合。元素节点也是唯一能够拥有属性的节点类型。该节点通过org.w3c.dom.Element接口来实现。 文本节点:只包含文本内容(在XML中称为字符数据)的节点,它可以由更多信息组成,也可包含空白。在文档树中元素跟属性的文本内容都是由文本节点来表示的。该节点通过org.w3c.dom.Text接口来实现,Text接口继承CharacterData接口。 属性节点:元素中的属性。属性实际上是附属元素的,所以属性节点不能被看作是元素的子节点,即属性没有被认为是文档树的一部分,例如在属性节点上调用getParentNode(),getPreviousSibling()和getNextSibling()返回都是NULL。 也就是说属性节点被看作包含他的元素节点的一部分,它并不作为单独的一个节点在文档树中出现。该节点通过org.w3c.dom.Attribute接口来实现。 注释节点:该节点通过org.w3c.dom.Comment接口来实现。 处理指令节点:表示XML文档中的处理指令。该节点通过org.w3c.dom.ProcessingInstruction接口来实现。 文档类型节点:每一个Document都有一个doctype属性,其值炜null或DocumentType对象。该节点通过org.w3c.dom.DocumentType接口来实现。 CDATA段节点表示XML文档中的CDATA段。该节点通过org.w3c.dom.CDAT ASection接口来实现。该接口继承自Text接口。 实体节点:XML文档中已分析或未分析实体。该节点通过org.w3c.dom.Entity接口来实现。 实体引用节点:DOM树中的一个实体引用。该节点通过org.w3c.dom.EntityReference接口来实现。 记号节点:在DTD中声明的记号。该节点通过org.w3c.dom.Notation接口来实现。 NodeList接口:提供了一个有序节点集合的抽象。该方法下定义了两个方法: 1.int getLength():该方法返回列表中节点的数目。 2.Node item(int index):该方法返回集合中指定索引的节点。集合中的索引从0开始。 注意:DOM中的NodeList对象是动态的。eg.使用Node接口的getChildNodes()得到一个节点的子节点列表,然后你调用insertBefore(),appendChild(),replaceChild()和removeChild()等任何一个方法,都将影响到NodeList对象,也就是说此时再调用getLength()和item()将返回与先前不同的值。 org.w3c.dom.NamedNodeMap接口:也是节点的集合。通过该接口可以建立节点名跟节点之间的一一映射,从而利用节点名直接访问对应的节点。 注意:该接口无序。并不是继承自NodeList接口。并且该接口也是动态的。 eg.在某个元素节点上调用getAttributes()将返回一个包含属性名和属性节点映射的NamedNodeMap对象。

<?xml version=”1.0” encoding=”gb2312”?> <?xml-stylesheet type=”text/xml” href=”students.xsl”> 张三 11 李四 14 java类:DOMStudentInfo.java Java代码 收藏代码 import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class DOMStudentInfo { /** * @param args */ public static void main(String[] args) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new File(“students.xml”)); NodeList nl = doc.getElementsByTagName(“student”); int len = nl.getLength(); for(int i=0;i<len;i++){ Element eltStu = (Element)nl.item(i); Node eltName = eltStu.getElementsByTagName(“name”).item(0); Node eltAge = eltStu.getElementsByTagName(“age”).item(0); //注意:此时不能用eltName.getNodeValue()得到“张三”的值 //因为”张三”这个文本节点是name的子节点,所以得调用 //eltName.getFirstChild().getNodeValue()来得到”张三”的值 System.out.println(“name:”+eltName.getFirstChild().getNodeValue()); System.out.println(“age:”+eltAge.getFirstChild().getNodeValue()); } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }" class="reference-link">DOM实例一:得到文本节点的内容 students.xml Java代码 收藏代码 <?xml version=”1.0” encoding=”gb2312”?> <?xml-stylesheet type=”text/xml” href=”students.xsl”> 张三 11 李四 14 java类:DOMStudentInfo.java Java代码 收藏代码 import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class DOMStudentInfo { /** * @param args */ public static void main(String[] args) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new File(“students.xml”)); NodeList nl = doc.getElementsByTagName(“student”); int len = nl.getLength(); for(int i=0;i<len;i++){ Element eltStu = (Element)nl.item(i); Node eltName = eltStu.getElementsByTagName(“name”).item(0); Node eltAge = eltStu.getElementsByTagName(“age”).item(0); //注意:此时不能用eltName.getNodeValue()得到“张三”的值 //因为”张三”这个文本节点是name的子节点,所以得调用 //eltName.getFirstChild().getNodeValue()来得到”张三”的值 System.out.println(“name:”+eltName.getFirstChild().getNodeValue()); System.out.println(“age:”+eltAge.getFirstChild().getNodeValue()); } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }

发表评论

表情:
评论列表 (有 0 条评论,413人围观)

还没有评论,来说两句吧...

相关阅读

    相关 DOM解析XML

    XML 结构是一种树型结构,处理步骤都差不多,Java 己经将它们封装成了现成的类库。目前流行的解析方法有三种,分别为 DOM、SAS 和 DOM4j。 DOM(Docume

    相关 DOM解析XML

    XML可以作为一种的简单数据存储。 DOM解析,是将XML中的数据组织成一棵树,树的一个一个节点就是XML文档中的数据。 DOM解析XML流程: 1.建立一个解析器工厂,

    相关 DOM解析XML

    XML 结构是一种树型结构,处理步骤都差不多,Java 己经将它们封装成了现成的类库。目前流行的解析方法有三种,分别为 DOM、SAS 和 DOM4j。 DOM(Docu...