Чтение локального XML-файла и его анализ с помощью DOM. Особенностью анализа DOM является загрузка всего XML-файла в память для формирования древовидной структуры DOM. Древовидная структура удобна для обхода и манипулирования.
Особенностью анализа DOM является чтение XML-файла, преобразование его в древовидную структуру dom и обход узлов.
Это концепция узлов W3c.
Если XML содержит большой объем данных, DOM не подходит для анализа XML, содержащего большой объем данных, из-за особенности загрузки XML в память за один раз. Если включен большой объем XML, анализ с помощью SAX экономит память.
Ниже приведен пример использования DOM для анализа XML-файлов:
Структура файла xml выглядит следующим образом:
<?xml version="1.0"coding="ISO-8859-1"?><bookstore> <book Category="cooking"> <title lang="en">Итальянский на каждый день</title> <author>Джиада Де Лаурентис </author> <year>2005</year> <price>30.00</price> </book> <book Category="children"> <title lang="en">Гарри Поттер</title> <author>J К. Роулинг</author> <year>2005</year> <price>29.99</price> </book> <book Category="web"> <title lang="en">XQuery Kick Start</title> <author>Джеймс Макговерн</ автор> <year>2003</year> <price>49.99</price> </book> <book Category="web" Cover="paperback"> <title lang="en">Изучение XML</title> < автор>Эрик Т. Рэй</author> <year>2003</year> <price>39,95</price> </book></bookstore>
Создайте класс для анализа XML следующим образом:
пакет xml.dom;импорт java.io.File;импорт javax.xml.parsers.DocumentBuilder;импорт javax.xml.parsers.DocumentBuilderFactory;импорт org.w3c.dom.Document;импорт org.w3c.dom.Element;импорт org .w3c.dom.Node; импорт org.w3c.dom.NodeList; общедоступный класс ReadXmlFile { public static void main(String[] args) { try { File xmlFile = new File("src/resource/book.xml"); DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = builderFactory.newDocumentBuilder(); Документ документа = builder.parse(xmlFile); doc.getDocumentElement().normalize(); System.out.println("Корневой элемент: "+doc.getDocumentElement().getNodeName()); for(int i = 0 ; i<nList.getLength();i++){ Узел node = nList.item(i); System.out.println("Имя узла: "+ node.getNodeName()); Элемент ele = (Element)node; System.out.println("---------------- ------------"); if(node.getNodeType() == Element.ELEMENT_NODE){ System.out.println("категория книги: "+ ele.getAttribute("категория")) ; System.out.println("имя заголовка: "+ ele.getElementsByTagName("title").item(0).getTextContent()); System.out.println("имя автора: "+ele.getElementsByTagName("author").item(0).getTextContent()); System.out.println("год :"+ele.getElementsByTagName("year").item(0).getTextContent()); System.out.println("price : "+ele.getElementsByTagName("price").item(0).getTextContent() ); System.out.println("-------------------------");
Результаты анализа:
Корневой элемент: книжный магазинНазвание узла: книга--------------------------Категория книги: кулинарияНазвание названия: Everyday ItalianИмя автора: Джада Де ЛаурентисГод: 2005Цена: 30,00 -------------------------Имя узла: book------------------ --- -------Категория книги: детскаяНазвание книги: Гарри ПоттерИмя автора: Дж. К. РоулингГод: 2005цена: 29,99----------------------- -- Имя узла: book--------------------------категория книги: название веб-сайта: XQuery Kick Startauthor имя: Джеймс МакГовернГод:2003цена: 49,99-------------------------Имя узла: книга------------- ---------------категория книги: название веб-сайта: Learning XMLавтор: Эрик Т. Рэйгод:2003цена: 39,95----------------- --------
Вышеупомянутое предназначено для получения соответствующего значения по имени.
Следующий результат выводится с использованием узлов цикла:
Код режима вывода узла цикла выглядит следующим образом:
пакет xml.dom;импорт java.io.File;импорт javax.xml.parsers.DocumentBuilder;импорт javax.xml.parsers.DocumentBuilderFactory;импорт org.w3c.dom.Document;импорт org.w3c.dom.NamedNodeMap;импорт org .w3c.dom.Node;импорт org.w3c.dom.NodeList; public class ReadXmlFile2 { public static void main(String[] args) { try { File xmlFile = new File("src/resource/book.xml"); DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); ; DocumentBuilder builder = builderFactory.newDocumentBuilder() Документ =; builder.parse(xmlFile); doc.getDocumentElement().normalize(); System.out.println("Корневой элемент: "+doc.getDocumentElement().getNodeName()); if(doc.hasChildNodes()){ printNode (doc.getChildNodes()); } }catch (Exception e) {e.printStackTrace() } } public static void; printNode(NodeList nodeList) { System.out.println("------------------------"); // System.out.println(nodeList. getLength()); for(int i = 0; i<nodeList.getLength(); i++){ Узел node = (Node)nodeList.item(i); if(node.getNodeType() == Node.ELEMENT_NODE){ System.out.println("имя узла: "+node.getNodeName()); System.out.println("значение узла: "+node.getTextContent()); if(node.hasAttributes()){ NamedNodeMap nodeMap = node.getAttributes(); for(int j = 0; j < nodeMap.getLength(); j++){ Node nodenew = nodeMap.item(j); System.out.println("имя узла"+nodenew.getNodeName()); System.out.println("значение узла"+nodenew.getNodeValue()); if(node.hasChildNodes); ()){ printNode(node.getChildNodes()) } } } }};
Вывод следующий:
Корневой элемент: bookstore------------------------имя узла: bookstoreЗначение узла: Everyday Italian Джада Де Лаурентис 2005 30,00 Гарри Поттер Дж. К. Роулинг 2005 29,99 XQuery Kick Start James McGovern 2003 49,99 Изучение XML Эрик Т. Рэй 2003 39,95 ------------------ Имя узла: значение booknode: Everyday Italian Giada De Laurentiis 2005 30.00 имя узла категориязначение узла кулинария-------------------------имя узла: titleзначение узла: Everyday Italian имя узла langnode значение en------- ------------------имя узла: значение автора узла: Джада Де Лаурентис----------------------- - имя узла: значение узла года: 2005 ------------------------- Имя узла: значение узла цены: 30.00 ----------- - ------------имя узла: значение книжного узла: Гарри Поттер Дж. К. Роулинг 2005 29.99 имя узла категориязначение узла дети------------------------имя узла: заголовокзначение узла: Гарри Поттер имя узла значение langnode ru-------- ----------------имя узла: значение автораузла: Дж. К. Роулинг ------------------------ -------- имя узла: значение узла года: 2005 ------------------------- имя узла: значение узла цены: 29,99 ---- -------- ------------имя узла: значение booknode: XQuery Kick Start James McGovern 2003 49.99 имя узла значение узла категории web------------------------имя узла: titleзначение узла: XQuery Kick Start имя узла значение langnode en---------- ---------------имя узла: авторзначение узла: Джеймс Макговерн--------------------------узел имя: значение узла года: 2003-------------------------------- Имя узла: значение узла цены: 49,99 ----- ----------- --------имя узла: значение книжного узла: Изучение XML Эрик Т. Рэй 2003 39.95 имя узла категория значение узла имя вебузла значение Covernode в мягкой обложке------------------------имя узла: значение titlenode: Обучение имя XMLузла значение langnode en---------- - ------------имя узла: авторзначение узла: Эрик Т. Рэй --------------------------имя узла : значение узла года: 2003------------------------имя узла: значение узла цены: 39,95-------------- - ----------
Вопросы по узлам:
<book Category="cooking"> <title lang="en">Итальянский на каждый день</title> <author>Джиада Де Лаурентис</author> <year>2005</year> <price>30.00</price> </ книга>
Для книжных приложений: doc.getChildNodes() получает NodeList, длина которого равна 9.
9 узлов следующие:
заголовок узла
языковой узел
Повседневный узел
авторский узел
Узел Джада Де Лаурентис
узел года
узел 2005 г.
ценовой узел
30.00 узел