Java與XML(一):採用DOM操作XML檔案

來源:互聯網
上載者:User

1.DOM介紹

DOM 是用與平台和語言無關的方式表示XML文檔的官方 W3C 標準。DOM 是以階層組織的節點或資訊片斷的集合。這個階層允許開發人員在樹中尋找特定資訊。分析該結構通常需要載入整個文檔和構造階層, 然後才能做任何工作。 由於它是基於資訊層次的,因而 DOM 被認為是基於樹或基於對象的。DOM 以及廣義的基於樹的處理具有幾個優點。首先,由於樹在記憶體中是持久的,因此可以修改它以便應用程式能對資料和結構作出更改。 它還可以在任何時候在樹中上下導航, 而不是像 SAX 那樣是一次性的處理。 DOM使用起來也要簡單得多。

2.採用DOM解析XML檔案

代碼執行個體:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

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;

/**
* @Author:胡家威
* @CreateTime:2011-9-6 下午10:12:00
* @Description:採用DOM解析XML檔案
*/

public class DomXML {

public void domXMl(String fileName) {
try {
DocumentBuilder domBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputStream input = new FileInputStream(fileName);
Document doc = domBuilder.parse(input);
Element root = doc.getDocumentElement();
NodeList students = root.getChildNodes();
if (students != null) {
for (int i = 0, size = students.getLength(); i < size; i++) {
Node student = students.item(i);
if (student.getNodeType() == Node.ELEMENT_NODE) {
String sexString = student.getAttributes().getNamedItem("性別").getNodeValue();
System.out.println(sexString);
}

for (Node node = student.getFirstChild(); node != null; node = node.getNextSibling()) {
if (node.getNodeType() == Node.ELEMENT_NODE) {
if (node.getNodeName().equals("姓名")) {
String name = node.getFirstChild().getNodeValue();
System.out.println(name);
}
if (node.getNodeName().equals("年齡")) {
String age = node.getFirstChild().getNodeValue();
System.out.println(age);
}
if (node.getNodeName().equals("電話")) {
String tel = node.getFirstChild().getNodeValue();
System.out.println(tel);
}
}
}

}
}

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}

public static void main(String[] args) {
DomXML xmlTest = new DomXML();
String fileName = "students.xml";
xmlTest.domXMl(fileName);
}

}

目錄結構:在項目的根目錄下面放置一個XML檔案

 
<?xml version="1.0" encoding="UTF-8"?>
<學生花名冊>
    <學生 性別="男">
        <姓名>李華</姓名>
        <年齡>14</年齡>
        <電話>6287555</電話>
    </學生>
    <學生 性別="男">
        <姓名>張三</姓名>
        <年齡>16</年齡>
        <電話>8273425</電話>
    </學生>
</學生花名冊>

  

運行結果:

李華

14

6287555

張三

16

8273425

3.使用DOM操作XML檔案,進行增刪查改

程式碼範例:

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

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;

/**
 * @Author:胡家威
 * @CreateTime:2011-9-23 下午09:08:03
 * @Description:DOM操作XML檔案,增刪查改
 */

public class DealXML {

  public static void main(String[] args) {
    try {
      // Document-->Node
      Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("products.xml");
      Element root = document.getDocumentElement();

      // 增加一個元素節點
      Element newChild = document.createElement("project");
      newChild.setAttribute("id", "NP001");// 添加id屬性

      Element nelement = document.createElement("name");// 元素節點
      nelement.setTextContent("New Project");
      newChild.appendChild(nelement);
      Element selement = document.createElement("start-date");
      selement.setTextContent("March 20 1999");
      newChild.appendChild(selement);
      Element eelement = document.createElement("end-date");
      eelement.setTextContent("July 30 2004");
      newChild.appendChild(eelement);

      root.appendChild(newChild);

      // 尋找一個元素節點
      String expression = "/projects/project[3]";
      Element node = (Element) selectSingleNode(expression, root);// 轉型一下
      // 修改一個元素節點
      node.getAttributeNode("id").setNodeValue("new "+node.getAttribute("id"));
      // root.getElementsByTagName("project").item(2).setTextContent("");
      expression = "/projects/project";
      NodeList nodeList = selectNodes(expression, root);
      nodeList.item(1).getAttributes().getNamedItem("id").setNodeValue("New Id");
      // 刪除一個元素節點
      expression = "/projects/project[2]";
      node = (Element) selectSingleNode(expression, root);
      root.removeChild(root.getFirstChild());

      output(root, "newProjects.xml");
    } catch (SAXException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } catch (ParserConfigurationException e) {
      e.printStackTrace();
    }
  }

  public static void output(Node node, String filename) {
    TransformerFactory transFactory = TransformerFactory.newInstance();
    try {
      Transformer transformer = transFactory.newTransformer();
      // 設定各種輸出屬性
      transformer.setOutputProperty("encoding", "gb2312");
      transformer.setOutputProperty("indent", "yes");
      DOMSource source = new DOMSource();
      // 將待轉換輸出節點賦值給DOM源模型的持有人(holder)
      source.setNode(node);
      StreamResult result = new StreamResult();
      if (filename == null) {
        // 設定標準輸出資料流為transformer的底層輸出目標
        result.setOutputStream(System.out);
      } else {
        result.setOutputStream(new FileOutputStream(filename));
      }
      // 執行轉換從源模型到控制台輸出資料流
      transformer.transform(source, result);
    } catch (TransformerConfigurationException e) {
      e.printStackTrace();
    } catch (TransformerException e) {
      e.printStackTrace();
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }
  }

  // 尋找一個單獨的節點
  private static Node selectSingleNode(String expression, Object source) {
    try {
      return (Node) XPathFactory.newInstance().newXPath().evaluate(expression, source, XPathConstants.NODE);
    } catch (XPathExpressionException e) {
      e.printStackTrace();
      return null;
    }
  }

  // 尋找所有的節點
  private static NodeList selectNodes(String expression, Object source) {
    try {
      return (NodeList) XPathFactory.newInstance().newXPath().evaluate(expression, source, XPathConstants.NODESET);
    } catch (XPathExpressionException e) {
      e.printStackTrace();
      return null;
    }
  }

}

左邊是修改前的,右邊的是修改了之後產生的XML檔案

更多詳情請見:http://www.cnblogs.com/stephen-liu74/archive/2011/09/12/2151209.html

 

通過 Wiz 發布

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.