1. Предисловие
DOM4J - это очень отличный API с открытым исходным кодом Java, в основном используемый для чтения и написания документов XML, с отличной производительности, мощными функциями и очень удобным использованием. Кроме того, XML часто используется для носителей обмена данных, таких как вызов параметров, передаваемых веб -сервисом, и выполнение операций синхронизации данных, поэтому очень необходимо использовать DOM4J для анализа XML.
2. Условия подготовки
dom4j.jar
Адрес загрузки: http://sourceforge.net/projects/dom4j//
3. Используйте Dom4j для практики
1. Разбор документа XML
Идеи реализации:
<1> После прочтения пути XML он передается Saxreader и возвращает объект документа документа;
<2> Затем используйте этот объект документа, чтобы получить информацию о следующих узлах и детях;
Конкретный код заключается в следующем:
Импорт java.io.file; Импорт javaiofileinputstream; Импорт javaioinputstream; Импорт Javautiliterator; Импорт Javautillist; Импорт orgdom4jdocument; Импорт orgdom4jdocumentHelper; Импорт orgdom4jelement; Импорт orgdom4jiosaxReader; /** * Use dom4j to parse xml documents* @author Administrator * */ public class Dom4jParseXmlDemo { public void parseXml01(){ try{ //Convert the xml below src to input stream InputStream inputStream = new FileInputStream(new File("D:/project/dynamicWeb/src/resource/modulexml")); // inputStream inputStream = thisGetClass () getResourCeasStream ("/modulexml"); // Вы также можете найти XML на основе относительного пути скомпилированного файла класса // Создать читателя Saxreader, который специально используется для чтения XML SaxReader SaxReader = new SaxReader (); // Согласно методу переписывания чтения SaxReader, его можно прочитать через входной поток InputStream или через объект файла // документ Document = SaxReaderRead (InputStream); Document Document = SaxReaderRead (новый файл ("d:/project/dynamicweb/src/resource/modulexml")); // Абсолютный путь файла должен быть указан // Кроме того, также может использоваться конвертер XML, предоставленный DocumentHelper. // документ Document = DocumentHelperParsEtext ("<? XML version =/" 0/"Encoding =/" UTF-8/"?> <MODULES ID =/" 123/"> <MODULE> Это текстовая информация тега модуля </module> </modules>"); // Получить элемент элемента корневого узла rootElement = documentGetRootelement (); SystemOutPrintln ("root node node:" + rootelementgetname ()); // Получить имя узла Systemoutprintln («Сколько атрибутов имеет корневой узел:" + rootelementattributecount ()); // Получить номер атрибута узла SystemOutPrintln ("значение root node attiu Значение атрибута Node Id SystemOutPrintln («Текст в корневом узле:» + rootElementgetText ()); // Если у элемента есть дети, он возвращает пустую строку, в противном случае текст в узле будет возвращен // rootElementGetText (). Причина, почему ломация строки связано с тем, что ключ вкладок и новая макляут используются между лагерной, и это также рассматривается в линии. SystemOutPrintln ("text (1):" + rootElementGetTextTrim ()); // Что удалено, так это ключ вкладка и разрыв строки между тегом и тегом и т. Д., Не пространство до и после Content SystemOutPrintln ("Текстовое содержание корневого узла дочернего узла:" + rootEmentGetStringValue ()); // возвращать текстовую информацию всех дочерних узлов рекурсивно в текущем узле. // Получить элемент элемента узлов дочерних узлов = rootElementelement ("module"); if (element! = null) {SystemEputPrintln ("Sub-Node Text:" + elementGetText ()); // Поскольку дочерний узел и корневой узел являются объектами элемента, их методы работы одинаковы} // Однако в некоторых случаях XML более сложны, а спецификации не являются объединенными. Не существует прямого JavalangnullPointerException для определенного узла, поэтому после получения объекта элемента вы должны сначала определить, является ли это пустым корневым корневым дозом («root»); // Поддержка для изменения имени узела SystemPutprintln («Имя после корневого узла модифицировано:« + rootElemetgetName ()); RootElementsettext ("text"); // то же самое верно для изменения текста в Tag SystemOutPrintln («Текст после корневого узла изменен:" + rootElementGetText ()); } catch (Exception e) {eprintstackTrace (); }} public static void main (string [] args) {dom4jparsexmldemo demo = new dom4jparsexmldemo (); demoparsexml01 (); }}Кроме того, приведенный выше XML находится под SRC, Module01.xml выглядит следующим образом:
<? xml version = "0" Encoding = "utf-8"?> <modules id = "123"> <Модуль> Это текстовая информация тега модуля </module> </modules>
Затем выполните основной метод этого класса, и эффект консоли выглядит следующим образом:
Из этого мы знаем:
<1> Есть много способов прочитать XML -файлы;
<2> Очень просто снять текст и название метки объекта элемента;
<3> И очень удобно изменять текст и названия элементов, но он не будет записан в файлы XML -диска.
Выше приведено просто элемент корневого каталога XML, а затем проходит через объект документа документа с помощью итератора.
Конкретный код заключается в следующем:
public void parsexml02 () {try {// конвертировать XML ниже SRC в входной поток inputStream = thisgetClass () getResourCeasStream ("/modulexml"); // Создать считывателя SaxReader специально для чтения XML SaxReader SaxReader = new SaxReader (); // Согласно методу переписывания чтения SaxReader, видно, что его можно прочитать через входной поток ввода, или его можно прочитать через документ файла объекта = SaxReaderRead (inputStream); Element rootElement = documentGetRootelement (); Iterator <element> modulesiterator = rootlelementelements ("module") iterator (); // RootElementElement ("имя"); Получить определенный дочерний элемент // RootElementelements («Имя»); Получить набор детских элементов узлов Moudule под корневым узлом, вернуть тип сбора списка // RootElementelements («Модуль») итератор (); Итерация каждого элемента в возвращенном списке сбора и вернуть все узлы дочерних узлов в коллекцию итератора, в то время как (modulesiteratorhasnext ()) {element moduleelement = modulesiteratornext (); Element nameElement = moduleElementElement ("name"); SystemOutPrintln (nameElementGetName () + ":" + nameElementGettext ()); Element valueElement = moduleElementElement ("value"); SystemOutPrintln (valueElementGetName () + ":" + valueElementGetText ()); Элемент descriptionElement = moduleelementelement ("descript"); SystemOutPrintln (descriptElementGetName () + ":" + descrictEelEmptEmptText ()); }} catch (Exception e) {eprintstackTrace (); }} Кроме того, приведенный выше XML находится под SRC, Module02.xml выглядит следующим образом:
<? xml version = "1.0" Encoding = "UTF-8"?> <modules id = "123"> <dulule> <mame> oa </name> <dall> Конфигурация базовой системы </value> <descript> Корневой каталог основной конфигурации системы </descript> </modules> </modules>
Затем выполните основной метод этого класса, и эффект консоли выглядит следующим образом:
Из этого мы знаем:
<1> dom4j итерации над подэлементами XML очень эффективно и удобно;
Тем не менее, вышеупомянутые просто итерации над элементами детского узла XML, но если правила XML более сложны, такие как Module03.xml, которые будут проверены дальше, детали следующие:
<? xml version = "1.0" Encoding = "UTF-8"?> <modules id = "123"> <doolule> Это текстовая информация о теге модуля </module> <module id = ""> <mame> oa </name> <ditule> basic configuration </value> <copript> basic configuration для системы </name> <module> Эта текст. </module> <module> <name>Management configuration</name> <value>none</value> <descript>Instructions for managing configuration</descript> <module id="106"> <name>System management</name> <value>0</value> <descript>Config</descript> <module id="107"> <name>Department number</name> <value>20394</value> <descript> number </descript> </module> </module> </module> </modules>
Поскольку их структуры различны, если они обращаются напрямую, будет сообщена ошибка:
java.lang.nullpointerexception
Так что вам нужно тщательно использовать его в это время. Вы не можете помещать элементы непосредственно в итерацию каждый раз. Конкретный код реализации выглядит следующим образом:
public void parsexml03 () {try {// конвертировать XML ниже SRC в входной поток inputStream = thisGetClass () getResourCeasStream ("/modulexMl"); // Создать считывателя SaxReader специально для чтения XML SaxReader SaxReader = new SaxReader (); // Согласно методу переписывания чтения SaxReader, видно, что его можно прочитать через входной поток ввода, или его можно прочитать через документ файла объекта = SaxReaderRead (inputStream); Element rootElement = documentGetRootelement (); if (RootElementElements ("module")! = null) {// Поскольку первая тег модуля имеет только содержание, а не дочерние узлы, итератор () - javalangnullPointerException, поэтому ему необходимо реализовать список <element> letle -list = rootElementelements ("module"); for (элемент элемента: elementlist) {if (! elementgetTextTrim () equals ("")) {SystemOutPrintln ("【1】" + elementGetTextTrim ()); } else {element nameElement = elementElement ("name"); SystemOutPrintln ("【2】" + nameElementGetName () + ":" + nameElementGettext ()); Element valueElement = elementElement ("value"); SystemOutPrintln ("【2】" + valueElementGetName () + ":" + valueElementGettext ()); Элемент descriptionElement = elementElement ("descript"); SystemOutPrintln ("【2】" + descriptionElementGetName () + ":" + descriptionEmentgetText ()); List <element> subelementList = elementElements ("Module"); for (element subelement: subelementlist) {if (! subelementgetTextTrim () equals ("")) {SystemOutPrintln ("【3】" + subelementGetTextTrim ()); } else {element subnameelement = subelementElement ("name"); SystemOutPrintln ("【3】" + subnameelementGetName () + ":" + subnameElementGetText ()); Element subvalueElement = subelementElement ("value"); SystemOutPrintln ("【3】" + subvalueElementGetName () + ":" + subvalueElementGetText ()); Element subdescriptelement = subelementelement ("descript"); SystemOutPrintln ("【3】" + subdescriptElementGetName () + ":" + subdescriptElementGetText ()); }}}}}} catch (Exception e) {eprintStackTrace (); }}Затем выполните основной метод этого класса, и эффект консоли выглядит следующим образом:
Хорошо, теперь мы можем решить проблему пустых ссылок в итеративных документах.
Кроме того, код на самом деле может быть рефактован, потому что операция по выводу детских элементов в цикле повторяется, и его можно улучшить за счет рекурсии, но читабельность будет немного хуже.
Если вам иногда нужно получить всю текстовую информацию в XML, или формат XML, переданный другими, не является стандартизированным, например, имя в теге, чувствительно к случаям, хотя XML не чувствителен к случаям, оно должно появляться парами. Поэтому, чтобы избежать этого, вы можете просто изменить все названия тегов, чтобы заработать. Конкретный код заключается в следующем:
public static void main(String[] args) { String str = "<?xml version=/"0/" encoding=/"UTF-8/"?><modules id=/"123/"><module> This is the text information of the module tag <name>oa</name><value>Basic configuration</value><descript>Basic configuration of the system</descript></module></modules>"; SystemUtprintln (strreplaceall ("<[^<]*>", "_")); Pattern Pattern = PatternCompile ("<[^<]*>"); Matcher Matcher = patternmatcher (str); while (matcherfind ()) {str = strreplaceall (matchtergroup (0), matchergroup (0) touppercase ()); } SystemOutPrintln (str); }После бега визуализации следующие:
2. Сгенерировать документ XML
DOM4J может анализировать XML, и он определенно будет генерировать XML, и его легче использовать.
Идеи реализации:
<1> DocumentHelper предоставляет метод создания объекта документа;
<2> управляйте этим объектом документа и добавьте узел и значения текста, имени и атрибута под узлом;
<3> Затем используйте автора XMLWriter, чтобы написать инкапсулированный объект документа на диск;
Конкретный код заключается в следующем:
Импорт java.io.fileWriter; Импорт javaioioexception; Импорт Javaiowriter; Импорт orgdom4jdocument; Импорт orgdom4jdocumentHelper; Импорт orgdom4jelement; Импорт orgdom4jioxmlwriter; /** * Используйте dom4j для генерации документов XML * @author Administrator * */public class Dom4jbuildxmldemo {public void build01 () {try {// DocumentHelper предоставляет метод для создания документа Document Object Document = DocumentHelPerCreateDocument (); // Добавить элемент информации Node rootElement = documentAddelement ("Модули"); // это может продолжать добавлять дочерние узлы или указать Content rootelementeStextxt («Это текстовая информация тега модуля»); Element = rootElementAddelement ("Module"); Element nameElement = elementAddelement ("name"); Element valueElement = elementAddelement ("value"); Элемент descriptionElement = elementAddelement ("description"); nameelementsettext ("name"); nameElementAddattribute ("language", "java"); // Добавить значение значения атрибута для Node ValueElementseTtext ("value"); valueElementAddattribute ("language", "c#"); descriptionElementsettext ("description"); descriptionElementAddattribute ("язык", "SQL Server"); SystemOutPrintln (documentsxml ()); // конвертировать объект документа непосредственно в строковые выводы worper filewriter = new FileWriter ("c: // modulexml"); // Dom4j предоставляет объект, специально написанный в файлах xmlwriter xmlwriter xmlwriter = new XmlWriter (файл warriter); XmlWriterWrite (документ); xmlwriterflush (); xmlwriterclose (); SystemOutPrintln («XML документ был успешно добавлен!»); } catch (ioException e) {eprintstackTrace (); }} public static void main (string [] args) {dom4jbuildxmldemo demo = new dom4jbuildxmldemo (); demobuild01 (); }} Эффект запуска кода заключается в следующем:
Затем перейдите на диск C ниже, чтобы проверить, было ли творение успешным. Оказалось, что контент в файле XML совпадает с выводом содержимого консоли.
Кроме того, приведенный выше XML не указывает формат кодирования, но UTF-8 все еще отображается, что указывает на то, что это формат кодирования по умолчанию. Если вы хотите повторно определить, вы можете добавить document.setxmlencoding ("gbk"); Прежде чем писать на диск.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.