Автор оригинала: 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("------");
// get
NodeList 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/”