最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用jaxp進(jìn)行dom解析_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

 更新時(shí)間:2017年08月02日 10:14:14   投稿:mrr  
這篇文章主要介紹了使用jaxp進(jìn)行dom解析的相關(guān)資料,需要的朋友可以參考下

1.javax.xml.parsers 包中的DocumentBuilderFactory用于創(chuàng)建DOM模式的解析器對(duì)象 , DocumentBuilderFactory是一個(gè)抽象工廠類,它不能直接實(shí)例化,但該類提供了一個(gè)newInstance方法 ,這個(gè)方法會(huì)根據(jù)本地平臺(tái)默認(rèn)安裝的解析器,自動(dòng)創(chuàng)建一個(gè)工廠的對(duì)象并返回

2.調(diào)用 DocumentBuilderFactory.newInstance() 方法得到創(chuàng)建 DOM 解析器的工廠。

3.調(diào)用工廠對(duì)象的 newDocumentBuilder方法得到 DOM 解析器對(duì)象。

4.調(diào)用 DOM 解析器對(duì)象的 parse() 方法解析 XML 文檔,得到代表整個(gè)文檔的 Document 對(duì)象,進(jìn)行可以利用DOM特性對(duì)整個(gè)XML文檔進(jìn)行操作了。

案例1.遍歷xml文件中跟節(jié)點(diǎn)下面的所有子節(jié)點(diǎn).

1.xml的約束文件Java.dtd

<!ELEMENT classes (java班,net班,php班,ios班)> 
<!ELEMENT java班 (teachers?,students?)> 
<!ELEMENT net班 (teachers?,students?)> 
<!ELEMENT php班 (teachers?,students?)> 
<!ELEMENT ios班 (teachers?,students?)> 
<!ELEMENT teachers (teacher*)> 
<!ELEMENT teacher EMPTY> 
<!ELEMENT students (student*)> 
<!ELEMENT student (name,sex,age)> 
<!ATTLIST java班 name CDATA #IMPLIED> 
<!ATTLIST net班 name CDATA #IMPLIED> 
<!ATTLIST php班 name CDATA #IMPLIED> 
<!ATTLIST ios班 name CDATA #IMPLIED> 
<!ATTLIST teacher name CDATA #IMPLIED> 
<!ATTLIST teacher sex CDATA #IMPLIED> 
<!ATTLIST teacher age CDATA #IMPLIED> 
<!ELEMENT name (#PCDATA)> 
<!ELEMENT sex (#PCDATA)> 
<!ELEMENT age (#PCDATA)> 
<!ATTLIST student id ID #IMPLIED> 

2.xml文件內(nèi)容如下java.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE classes SYSTEM "bin//parsers//java.dtd"> 
<classes> 
  <java班 name="CSDNJava01班"> 
    <teachers> 
      <teacher name="軍哥" sex="男" age="28" /> 
      <teacher name="劉麗華" sex="女" age="28" /> 
    </teachers> 
    <students> 
      <student id="x121"> 
        <name>王亮</name> 
        <sex>女</sex> 
        <age>28</age> 
      </student> 
    </students> 
  </java班> 
  <!-- 注釋0 --> 
  <net班 name="CSDNNet01班">xxx</net班> 
  <php班 name="CSDNPhp01班"></php班> 
  <ios班 name="CSDNIos01班"></ios班> 
</classes> 
<!-- 對(duì)java.xml文件進(jìn)行CRUD的操作 --> 
<!-- 節(jié)點(diǎn) 
    nodeName      nodeValue    nodeType 
element 標(biāo)簽名        null       1 
Attr   屬性名       屬性值      2 
text   #text        文本的值     3 
 --> 

3.遍歷xml文件的操作

//1.獲取XML的根節(jié)點(diǎn)對(duì)象
@Test 
  public void test() throws ParserConfigurationException, SAXException, IOException{ 
    //調(diào)用 DocumentBuilderFactory.newInstance() 方法得到創(chuàng)建 DOM 解析器的工廠 
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 
    //調(diào)用工廠對(duì)象的 newDocumentBuilder方法得到 DOM 解析器對(duì)象 
    DocumentBuilder builder = builderFactory.newDocumentBuilder(); 
    //通過(guò)文件的方式獲取Document對(duì)象 
    /*File file = new File("src//parsers//java.xml"); 
    System.out.println(file+"----"); 
    Document document = builder.parse(file);*/ 
    //解析指定的文件 
    InputStream is= this.getClass().getClassLoader() 
               .getResourceAsStream("parsers//java.xml"); 
    Document document = builder.parse(is); 
     
    //document.getDocumentElement()獲取根節(jié)點(diǎn)的元素對(duì)象 
    Element root = document.getDocumentElement(); 
    //遍歷根節(jié)點(diǎn)下面的所有子節(jié)點(diǎn) 
    listNodes(root); 
  } 

2.遍歷節(jié)點(diǎn)對(duì)象的方法

/** 
   * 遍歷根據(jù)節(jié)點(diǎn)對(duì)象下面的所有的節(jié)點(diǎn)對(duì)象 
   * @param node 
   */ 
  public void listNodes(Node node) { 
    // 節(jié)點(diǎn)是什么類型的節(jié)點(diǎn) 
    if (node.getNodeType() == Node.ELEMENT_NODE) {// 判斷是否是元素節(jié)點(diǎn) 
      Element element = (Element) node; 
      //判斷此元素節(jié)點(diǎn)是否有屬性 
      if(element.hasAttributes()){ 
        //獲取屬性節(jié)點(diǎn)的集合 
        NamedNodeMap namenm =  element.getAttributes();//Node 
        //遍歷屬性節(jié)點(diǎn)的集合 
        for(int k=0;k<namenm.getLength();k++){ 
          //獲取具體的某個(gè)屬性節(jié)點(diǎn) 
          Attr attr = (Attr) namenm.item(k); 
          System.out.println("name:::"+attr.getNodeName()+" value::" 
                   +attr.getNodeValue()+" type::"+attr.getNodeType()); 
        } 
      } 
      //獲取元素節(jié)點(diǎn)的所有孩子節(jié)點(diǎn) 
      NodeList listnode = element.getChildNodes(); 
      //遍歷 
      for (int j = 0; j < listnode.getLength(); j++) { 
        //得到某個(gè)具體的節(jié)點(diǎn)對(duì)象 
        Node nd = listnode.item(j); 
        System.out.println("name::" + nd.getNodeName() + " value:::" 
            + nd.getNodeValue() + " type:::" + nd.getNodeType()); 
        //重新調(diào)用遍歷節(jié)點(diǎn)的操作的方法 
        listNodes(nd); 
      } 
 
    } 
  } 

4.查詢某個(gè)節(jié)點(diǎn)對(duì)象(簡(jiǎn)單列舉一些案例)

/** 
 * 根據(jù)標(biāo)簽的名稱查找所有該名稱的節(jié)點(diǎn)對(duì)象 
 */ 
public void findNode(Document document) { 
  //根據(jù)標(biāo)簽名稱獲取該名稱的所有節(jié)點(diǎn)對(duì)象 
  NodeList nodelist = document.getElementsByTagName("teacher"); 
  //遍歷 
  for (int i = 0; i < nodelist.getLength(); i++) { 
    //得到具體的某個(gè)節(jié)點(diǎn)對(duì)象 
    Node node = nodelist.item(i); 
    System.out.println(node.getNodeName()); 
  } 
} 
 
/** 
 * 根據(jù)屬性的值 查詢某個(gè)節(jié)點(diǎn)對(duì)象 
 * 屬性值是唯一(假設(shè)) 
 * @param document 
 * @param value 
 * @return 
 */ 
public Node findNodeByAttrValue(Document document, String value) { 
  //根據(jù)標(biāo)簽名稱獲取該名稱的節(jié)點(diǎn)對(duì)象集合 
  NodeList nodelist = document.getElementsByTagName("teacher"); 
  //遍歷 
  for (int i = 0; i < nodelist.getLength(); i++) { 
    //獲取某個(gè)具體的元素節(jié)點(diǎn)對(duì)象 
    Element node = (Element) nodelist.item(i); 
    //根據(jù)屬性名稱獲取該節(jié)點(diǎn)的屬性節(jié)點(diǎn)對(duì)象 
    Attr attr = node.getAttributeNode("name"); 
    //獲取屬性節(jié)點(diǎn)的值是否給指定的節(jié)點(diǎn)屬性值相同 
    if (attr.getNodeValue().equals(value)) { 
      //返回此節(jié)點(diǎn) 
      return node; 
    } 
  } 
  return null; 
} 
 
/** 
 * 根據(jù)id獲取某個(gè)節(jié)點(diǎn)對(duì)象 
 * 
 * @param document 
 * @param id 
 * @return 
 */ 
public Node findNodeById(Document document, String id) { 
  return document.getElementById(id); 
} 

5.刪除指定的節(jié)點(diǎn)對(duì)象

/** 
   * 刪除某個(gè)節(jié)點(diǎn)對(duì)象 
   * 
   * @param document 
   * @param id 
   * @throws TransformerException 
   */ 
  public void deleteNodeById(Document document, String id) 
      throws TransformerException { 
    //獲取刪除的節(jié)點(diǎn)對(duì)象 
    Node node = document.getElementById(id); 
    // 是通過(guò)父節(jié)點(diǎn)調(diào)用removeChild(node)把子節(jié)點(diǎn)給刪除掉 
    Node node1 = node.getParentNode().removeChild(node); 
     
    //創(chuàng)建TransformerFactory對(duì)象 
    TransformerFactory transformerFactory = TransformerFactory 
        .newInstance(); 
    //Transformer類用于把代表XML文件的Document對(duì)象轉(zhuǎn)換為某種格式后進(jìn)行輸出 
    //Transformer對(duì)象通過(guò)TransformerFactory獲得 
    Transformer transformer = transformerFactory.newTransformer(); 
    // 把Document對(duì)象又重新寫(xiě)入到一個(gè)XML文件中。 
    transformer.transform(new DOMSource(document), new StreamResult( 
        new File("src//a.xml"))); 
  } 

6.更新某個(gè)節(jié)點(diǎn)對(duì)象

/** 
 * 更新某個(gè)節(jié)點(diǎn) 
 * 
 * @param document 
 * @param id 
 * @throws TransformerException 
 */ 
public void updateNodeById(Document document, String id) 
    throws TransformerException { 
  //根據(jù)id獲取元素指定的元素節(jié)點(diǎn)對(duì)象 
  Element node = document.getElementById(id); 
  //獲取元素節(jié)點(diǎn)的id屬性節(jié)點(diǎn)對(duì)象 
  Attr attr = node.getAttributeNode("id"); 
  //修改元素節(jié)點(diǎn)的屬性值 
  attr.setValue("x122"); 
 
  //獲取該節(jié)點(diǎn)對(duì)象的所有孩子節(jié)點(diǎn)對(duì)象name、age、sex節(jié)點(diǎn) 
  NodeList nodelist = node.getChildNodes(); 
    //遍歷 
  for (int i = 0; i < nodelist.getLength(); i++) { 
    //得到具體的節(jié)點(diǎn)對(duì)象 
    Node n = nodelist.item(i); 
    //判斷是否是元素節(jié)點(diǎn)對(duì)象 
    if (n.getNodeType() == Node.ELEMENT_NODE) { 
      //看是否是name節(jié)點(diǎn) 
      if (n.getNodeName().equals("name")) { 
        n.setTextContent("君君");//修改其值 
      } else if (n.getNodeName().equals("age")) {//看看是否是age節(jié)點(diǎn) 
        n.setTextContent("80");//修改其值 
      } else if (n.getNodeName().equals("sex")) {//看看是否是sex節(jié)點(diǎn) 
        n.setTextContent("男");//修改其值 
      } else { 
        System.out.println("不做處理"); 
      } 
    } 
  } 
 
  //創(chuàng)建TransformerFactory對(duì)象 
  TransformerFactory transformerFactory = TransformerFactory 
      .newInstance(); 
  //Transformer類用于把代表XML文件的Document對(duì)象轉(zhuǎn)換為某種格式后進(jìn)行輸出 
  //Transformer對(duì)象通過(guò)TransformerFactory獲得 
  Transformer transformer = transformerFactory.newTransformer(); 
  //把Document對(duì)象又重新寫(xiě)入到一個(gè)XML文件中。 
  transformer.transform(new DOMSource(document), new StreamResult( 
      new File("src//b.xml"))); 
} 

7.在某個(gè)節(jié)點(diǎn)的下方添加新的節(jié)點(diǎn)

/** 
 * 在指定的節(jié)點(diǎn)下方添加新得某個(gè)節(jié)點(diǎn) 
 * 
 * @param document 
 * @param id 
 * @throws TransformerException 
 */ 
public void addNodeById(Document document, String id) 
    throws TransformerException { 
  //獲取要添加位置節(jié)點(diǎn)的兄弟節(jié)點(diǎn)對(duì)象 
  Element node = document.getElementById(id); 
  //獲取其父節(jié)點(diǎn)對(duì)象 
  Node parentNode = node.getParentNode(); 
  //創(chuàng)建元素節(jié)點(diǎn) 
  Element nd = document.createElement("student"); 
  //設(shè)置元素節(jié)點(diǎn)的屬性值 
  nd.setAttribute("id", "x123"); 
  //創(chuàng)建name元素節(jié)點(diǎn) 
  Node name = document.createElement("name"); 
  //設(shè)置name節(jié)點(diǎn)的文本值 
  name.appendChild(document.createTextNode("陳紅軍")); 
  //創(chuàng)建age元素節(jié)點(diǎn) 
  Node age = document.createElement("age"); 
  //設(shè)置age節(jié)點(diǎn)的文本值 
  age.appendChild(document.createTextNode("20")); 
  //創(chuàng)建sex元素節(jié)點(diǎn) 
  Node sex = document.createElement("sex"); 
  //設(shè)置sex節(jié)點(diǎn)的文本值 
  sex.appendChild(document.createTextNode("男")); 
  //在nd節(jié)點(diǎn)中添加3個(gè)子節(jié)點(diǎn) 
  nd.appendChild(name); 
  nd.appendChild(age); 
  nd.appendChild(sex); 
  //在父節(jié)點(diǎn)中添加nd節(jié)點(diǎn) 
  parentNode.appendChild(nd); 
  //創(chuàng)建TransformerFactory對(duì)象 
  TransformerFactory transformerFactory = TransformerFactory 
      .newInstance(); 
  //Transformer類用于把代表XML文件的Document對(duì)象轉(zhuǎn)換為某種格式后進(jìn)行輸出 
  //Transformer對(duì)象通過(guò)TransformerFactory獲得 
  Transformer transformer = transformerFactory.newTransformer(); 
  //把Document對(duì)象又重新寫(xiě)入到一個(gè)XML文件中。 
  transformer.transform(new DOMSource(document), new StreamResult( 
      new File("src//c.xml"))); 
} 

通過(guò)以上方法的練習(xí)希望你對(duì)xml的DOM解析有個(gè)入門(mén)的了解.

總結(jié)

以上所述是小編給大家介紹的使用jaxp進(jìn)行dom解析_,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Spring事務(wù)的七種傳播行為

    Spring事務(wù)的七種傳播行為

    這篇文章主要介紹了Spring事務(wù)的七種傳播行為,文章圍繞主題的相關(guān)資料展開(kāi)詳細(xì)的內(nèi)容解說(shuō),具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-04-04
  • Java8的常用時(shí)間api實(shí)用指南

    Java8的常用時(shí)間api實(shí)用指南

    這篇文章主要給大家介紹了關(guān)于Java8的常用時(shí)間api的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Java讀取Oracle大字段數(shù)據(jù)(CLOB)的2種方法

    Java讀取Oracle大字段數(shù)據(jù)(CLOB)的2種方法

    這篇文章主要介紹了Java讀取Oracle大字段數(shù)據(jù)(CLOB)的2種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Spring Boot使用Druid和監(jiān)控配置方法

    Spring Boot使用Druid和監(jiān)控配置方法

    Druid是Java語(yǔ)言中最好的數(shù)據(jù)庫(kù)連接池,并且能夠提供強(qiáng)大的監(jiān)控和擴(kuò)展功能。下面來(lái)說(shuō)明如何在 Spring Boot 中配置使用Druid
    2017-04-04
  • Java之map的常見(jiàn)用法講解與五種循環(huán)遍歷實(shí)例代碼理解

    Java之map的常見(jiàn)用法講解與五種循環(huán)遍歷實(shí)例代碼理解

    map是一組鍵值對(duì)的組合,通俗理解類似一種特殊的數(shù)組,a[key]=val,只不過(guò)數(shù)組元素的下標(biāo)是任意一種類型,而且數(shù)組的元素的值也是任意一種類型。有點(diǎn)類似python中的字典。通過(guò)"鍵"來(lái)取值,類似生活中的字典,已知索引,來(lái)查看對(duì)應(yīng)的信息
    2021-09-09
  • spring data JPA 中的多屬性排序方式

    spring data JPA 中的多屬性排序方式

    這篇文章主要介紹了spring data JPA 中的多屬性排序方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 基于java類路徑classpath和包的實(shí)例講解

    基于java類路徑classpath和包的實(shí)例講解

    下面小編就為大家分享一篇基于java類路徑classpath和包的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • SpringBoot自定義MessageConvert詳細(xì)講解

    SpringBoot自定義MessageConvert詳細(xì)講解

    正在學(xué)習(xí)SpringBoot,在自定義MessageConverter時(shí)發(fā)現(xiàn):為同一個(gè)返回值類型配置多個(gè)MessageConverter時(shí),可能會(huì)發(fā)生響應(yīng)數(shù)據(jù)格式錯(cuò)誤,或406異常(客戶端無(wú)法接收相應(yīng)數(shù)據(jù))。在此記錄一下解決問(wèn)題以及追蹤源碼的過(guò)程
    2023-01-01
  • RocketMQ延遲消息超詳細(xì)講解

    RocketMQ延遲消息超詳細(xì)講解

    延時(shí)消息是指發(fā)送到 RocketMQ 后不會(huì)馬上被消費(fèi)者拉取到,而是等待固定的時(shí)間,才能被消費(fèi)者拉取到。延時(shí)消息的使用場(chǎng)景很多,比如電商場(chǎng)景下關(guān)閉超時(shí)未支付的訂單,某些場(chǎng)景下需要在固定時(shí)間后發(fā)送提示消息
    2023-02-02
  • Springboot使用kafka的兩種方式

    Springboot使用kafka的兩種方式

    在公司用kafka比較多,今天整理下Springboot使用kafka的兩種方式,Kafka作為一個(gè)消息發(fā)布訂閱系統(tǒng),就包括消息生成者和消息消費(fèi)者,文中通過(guò)代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-11-11

最新評(píng)論

浪卡子县| 宜阳县| 乌鲁木齐市| 黄浦区| 云龙县| 丽江市| 邵阳县| 密云县| 安平县| 比如县| 滨州市| 璧山县| 金塔县| 双城市| 雷波县| 新兴县| 客服| 虎林市| 普兰店市| 石泉县| 宜宾市| 临城县| 斗六市| 伊宁县| 台中市| 泽普县| 湘潭市| 平远县| 吴江市| 油尖旺区| 兴仁县| 周至县| 雷山县| 罗源县| 南华县| 德庆县| 莱州市| 翁牛特旗| 芒康县| 浑源县| 西华县|