Как читать XML-файл в Java - (DOM Parser)
В этом руководстве мы покажем вам, как читать файл XML черезDOM XML parser. DOM parser parses the entire XML document and loads it into memory; then models it in a “TREE” structure for easy traversal or manipulation.
Короче говоря, он превращает XML-файл вDOM или древовидную структуру, и вам нужно проходить узел за узлом, чтобы получить то, что вы хотите.
What is Node?
В DOM все в XML-документе является узломread this.
Warning
DOM Parser работает медленно и потребляет много памяти при загрузке XML-документа, содержащего много данных. Пожалуйста, рассмотрите парсер SAX как решение для этого, SAX быстрее чем DOM и использует меньше памяти.
1. Пример синтаксического анализатора DOM XML
В этом примере показано, как получить узел по «имени» и отобразить значение.
/Users/example/staff.xml
yong mook kim example 100000 low yin fong fong fong 200000
ReadXMLFile.java
package com.example.seo; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import org.w3c.dom.Element; import java.io.File; public class ReadXMLFile { public static void main(String argv[]) { try { File fXmlFile = new File("/Users/example/staff.xml"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(fXmlFile); //optional, but recommended //read this - http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work doc.getDocumentElement().normalize(); System.out.println("Root element :" + doc.getDocumentElement().getNodeName()); NodeList nList = doc.getElementsByTagName("staff"); System.out.println("----------------------------"); for (int temp = 0; temp < nList.getLength(); temp++) { Node nNode = nList.item(temp); System.out.println("\nCurrent Element :" + nNode.getNodeName()); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; System.out.println("Staff id : " + eElement.getAttribute("id")); System.out.println("First Name : " + eElement.getElementsByTagName("firstname").item(0).getTextContent()); System.out.println("Last Name : " + eElement.getElementsByTagName("lastname").item(0).getTextContent()); System.out.println("Nick Name : " + eElement.getElementsByTagName("nickname").item(0).getTextContent()); System.out.println("Salary : " + eElement.getElementsByTagName("salary").item(0).getTextContent()); } } } catch (Exception e) { e.printStackTrace(); } } }
Результат
Root element :company ---------------------------- Current Element :staff Staff id : 1001 First Name : yong Last Name : mook kim Nick Name : example Salary : 100000 Current Element :staff Staff id : 2001 First Name : low Last Name : yin fong Nick Name : fong fong Salary : 200000
2. Зацикливание узла
В этом примере читается тот же файл «staff.xml», и он показывает, как выполнить цикл по одному узлу и распечатать имя и значение узла, а также атрибут, если он есть.
ReadXMLFile2.java
package com.example.seo; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class ReadXMLFile2 { public static void main(String[] args) { try { File file = new File("/Users/example/staff.xml"); DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance() .newDocumentBuilder(); Document doc = dBuilder.parse(file); System.out.println("Root element :" + doc.getDocumentElement().getNodeName()); if (doc.hasChildNodes()) { printNote(doc.getChildNodes()); } } catch (Exception e) { System.out.println(e.getMessage()); } } private static void printNote(NodeList nodeList) { for (int count = 0; count < nodeList.getLength(); count++) { Node tempNode = nodeList.item(count); // make sure it's element node. if (tempNode.getNodeType() == Node.ELEMENT_NODE) { // get node name and value System.out.println("\nNode Name =" + tempNode.getNodeName() + " [OPEN]"); System.out.println("Node Value =" + tempNode.getTextContent()); if (tempNode.hasAttributes()) { // get attributes names and values NamedNodeMap nodeMap = tempNode.getAttributes(); for (int i = 0; i < nodeMap.getLength(); i++) { Node node = nodeMap.item(i); System.out.println("attr name : " + node.getNodeName()); System.out.println("attr value : " + node.getNodeValue()); } } if (tempNode.hasChildNodes()) { // loop again if has child nodes printNote(tempNode.getChildNodes()); } System.out.println("Node Name =" + tempNode.getNodeName() + " [CLOSE]"); } } } }
Результат:
Root element :company Node Name =company [OPEN] Node Value = yong mook kim example 100000 low yin fong fong fong 200000 Node Name =staff [OPEN] Node Value = yong mook kim example 100000 attr name : id attr value : 1001 Node Name =firstname [OPEN] Node Value =yong Node Name =firstname [CLOSE] Node Name =lastname [OPEN] Node Value =mook kim Node Name =lastname [CLOSE] Node Name =nickname [OPEN] Node Value =example Node Name =nickname [CLOSE] Node Name =salary [OPEN] Node Value =100000 Node Name =salary [CLOSE] Node Name =staff [CLOSE] Node Name =staff [OPEN] Node Value = low yin fong fong fong 200000 attr name : id attr value : 2001 Node Name =firstname [OPEN] Node Value =low Node Name =firstname [CLOSE] Node Name =lastname [OPEN] Node Value =yin fong Node Name =lastname [CLOSE] Node Name =nickname [OPEN] Node Value =fong fong Node Name =nickname [CLOSE] Node Name =salary [OPEN] Node Value =200000 Node Name =salary [CLOSE] Node Name =staff [CLOSE] Node Name =company [CLOSE]
Note
ЭтотHow to get Alexa Ranking
In Java может вас заинтересовать. It shows you how to use DOM to parse the Alexa XML result.