Автор оригинала: mkyong.
Этот учебник покажет вам, как использовать встроенный в Java анализатор DOM для чтения XML-файла.
- 1. Что такое Объектная модель документа (DOM)
- 2. Читать или анализировать XML-файл
- 3. Чтение или анализ XML-файла (Юникод)
- 4. Анализировать XML-ответ Alexa API
- 5. Скачать Исходный Код
- 6. Рекомендации
Примечание Анализатор DOM работает медленно и потребляет много памяти при чтении большого XML-документа, потому что он загружает все узлы в память для обхода и манипулирования.
Вместо этого мы должны рассмотреть синтаксический анализатор SAX для чтения XML-документа большого размера, SAX работает быстрее, чем DOM, и использует меньше памяти.
1. Что такое Объектная модель документа (DOM)
Объектная модель документа (DOM) использует узлы для представления документа HTML или XML в виде древовидной структуры.
Ниже приведен простой XML-документ:
yong mook kim mkyong 100000
Основные общие термины.
-
<компания>
является корневым элементом. -
<персонал>, <имя> и все >
являются узлами элементов. - Текстовый узел – это значение, заключенное в узлы элементов; например,
<имя>yong
,yong
– это текстовый узел. - Атрибут является частью узла элемента; например,
<персонал>
идентификатор
является атрибутом элементаперсонал
.
Дальнейшее Чтение
2. Читать или анализировать XML-файл
В этом примере показано, как использовать встроенные API DOM-анализатора Java для чтения или анализа XML-файла.
2.1 Просмотрите приведенный ниже XML-файл.
yong mook kim mkyong 100000 low yin fong fong fong 200000
2.2 Ниже приведен пример синтаксического анализа DOM для анализа или чтения вышеупомянутого XML-файла.
package com.mkyong.xml.dom; 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; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.File; import java.io.IOException; import java.io.InputStream; public class ReadXmlDomParser { private static final String FILENAME = "/users/mkyong/staff.xml"; public static void main(String[] args) { // Instantiate the Factory DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { // optional, but recommended // process XML securely, avoid attacks like XML External Entities (XXE) dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); // parse XML file DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new File(FILENAME)); // optional, but recommended // 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()); System.out.println("------"); // getNodeList list = doc.getElementsByTagName("staff"); for (int temp = 0; temp < list.getLength(); temp++) { Node node = list.item(temp); if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; // get staff's attribute String id = element.getAttribute("id"); // get text String firstname = element.getElementsByTagName("firstname").item(0).getTextContent(); String lastname = element.getElementsByTagName("lastname").item(0).getTextContent(); String nickname = element.getElementsByTagName("nickname").item(0).getTextContent(); NodeList salaryNodeList = element.getElementsByTagName("salary"); String salary = salaryNodeList.item(0).getTextContent(); // get salary's attribute String currency = salaryNodeList.item(0).getAttributes().getNamedItem("currency").getTextContent(); System.out.println("Current Element :" + node.getNodeName()); System.out.println("Staff Id : " + id); System.out.println("First Name : " + firstname); System.out.println("Last Name : " + lastname); System.out.println("Nick Name : " + nickname); System.out.printf("Salary [Currency] : %,.2f [%s]%n%n", Float.parseFloat(salary), currency); } } } catch (ParserConfigurationException | SAXException | IOException e) { e.printStackTrace(); } } }
Выход
Root Element :company ------ Current Element :staff Staff Id : 1001 First Name : yong Last Name : mook kim Nick Name : mkyong Salary [Currency] : 100,000.00 [USD] Current Element :staff Staff Id : 2001 First Name : low Last Name : yin fong Nick Name : fong fong Salary [Currency] : 200,000.00 [INR]
3. Чтение или анализ XML-файла (Юникод)
В синтаксическом анализаторе DOM нет разницы между чтением обычного XML-файла и XML-файла в Юникоде.
3.1 Просмотрите приведенный ниже XML-файл, содержащий некоторые китайские иероглифы (Юникод).
揚 木金 mkyong 100000 low yin fong fong fong 200000
3.2 Приведенный ниже пример анализирует приведенный выше XML-файл; он перебирает все узлы один за другим и распечатывает его.
package com.mkyong.xml.dom; import org.w3c.dom.*; import org.xml.sax.SAXException; import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.io.InputStream; public class ReadXmlDomParserLoop { public static void main(String[] args) { // Instantiate the Factory DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try (InputStream is = readXmlFileIntoInputStream("staff-unicode.xml")) { // parse XML file DocumentBuilder db = dbf.newDocumentBuilder(); // read from a project's resources folder Document doc = db.parse(is); System.out.println("Root Element :" + doc.getDocumentElement().getNodeName()); System.out.println("------"); if (doc.hasChildNodes()) { printNote(doc.getChildNodes()); } } catch (ParserConfigurationException | SAXException | IOException e) { e.printStackTrace(); } } 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]"); } } } // read file from project resource's folder. private static InputStream readXmlFileIntoInputStream(final String fileName) { return ReadXmlDomParserLoop.class.getClassLoader().getResourceAsStream(fileName); } }
Выход
Root Element :company ------ Node Name =company [OPEN] Node Value = 揚 木金 mkyong 100000 low yin fong fong fong 200000 Node Name =staff [OPEN] Node Value = 揚 木金 mkyong 100000 attr name : id attr value : 1001 Node Name =firstname [OPEN] Node Value =揚 Node Name =firstname [CLOSE] Node Name =lastname [OPEN] Node Value =木金 Node Name =lastname [CLOSE] Node Name =nickname [OPEN] Node Value =mkyong Node Name =nickname [CLOSE] Node Name =salary [OPEN] Node Value =100000 attr name : currency attr value : USD 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 attr name : currency attr value : INR Node Name =salary [CLOSE] Node Name =staff [CLOSE] Node Name =company [CLOSE]
4. Анализировать XML-ответ Alexa API
В этом примере показано, как использовать анализатор DOM для анализа XML-ответа из API Alexa.
4.1 Отправьте запрос на следующий API Alexa.
https://data.alexa.com/data?cli=10&url=mkyong.com
4.2 API Alexa вернет следующий XML-ответ. Рейтинг Alexa находится внутри элемента ПОПУЛЯРНОСТЬ
, атрибута ТЕКСТ
.
4.3 Мы используем анализатор DOM, чтобы напрямую выбрать элемент ПОПУЛЯРНОСТЬ
и распечатать значение атрибута ТЕКСТ
.
package com.mkyong.xml.dom; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; public class ReadXmlAlexaApi { private static final String ALEXA_API = "http://data.alexa.com/data?cli=10&url="; private final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); public static void main(String[] args) { ReadXmlAlexaApi obj = new ReadXmlAlexaApi(); int alexaRanking = obj.getAlexaRanking("mkyong.com"); System.out.println("Ranking: " + alexaRanking); } public int getAlexaRanking(String domain) { int result = 0; String url = ALEXA_API + domain; try { URLConnection conn = new URL(url).openConnection(); try (InputStream is = conn.getInputStream()) { // unknown XML better turn on this dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); DocumentBuilder dBuilder = dbf.newDocumentBuilder(); Document doc = dBuilder.parse(is); Element element = doc.getDocumentElement(); // find this tag "POPULARITY" NodeList nodeList = element.getElementsByTagName("POPULARITY"); if (nodeList.getLength() > 0) { Element elementAttribute = (Element) nodeList.item(0); String ranking = elementAttribute.getAttribute("TEXT"); if (!"".equals(ranking)) { result = Integer.parseInt(ranking); } } } } catch (Exception e) { e.printStackTrace(); throw new IllegalArgumentException("Invalid request for domain : " + domain); } return result; } }
Домен mkyong.com
ранжированный 20162
.
Ranking: 20162
Примечание Дополнительные примеры синтаксического анализа DOM – Oracle – Чтение XML-данных в DOM
5. Скачать Исходный Код
$клон git $клон git
$компакт-диск java-xml
$cd src/основной/java/com/mkyong/xml/дом/
6. Рекомендации
- Википедия – Java API для обработки XML
- Википедия – Объектная модель документа
- Oracle – Java API для обработки XML (JAXP)
- Объектная модель Oracle – Документа
- OWASP – Внешняя сущность XML (XXE) Обработка
- Stackoverflow – Нормализация при анализе DOM с помощью java – как это работает?
- Как получить Рейтинг Alexa На Java
- Как читать XML–файл на Java – (синтаксический анализатор SAX)
- Как читать XML–файл на Java – (синтаксический анализатор JDOM)
Оригинал: “https://mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/”