XML это так просто

Java Java EE

Что такое XML?

XML: расширяемый язык разметки называется расширяемым языком разметки.

Краткая история XML:

  • gml->sgml->html->xml
  • gml (общий язык разметки) — спецификация данных для связи между разными машинами.
  • sgml (стандартный обобщенный язык разметки)
  • html (язык гипертекстовой разметки)

Зачем нам нужно использовать XML?

  • ① до того, как у нас не было языка XML, мы использовали строку как общение между двумя программами! Теперь приходит вопрос, если мы передаем данные с реляционной структурой, как строка выражает его? Строка не хороша в реляционных данных, и если она описана, она неизбежно будет неоднозначным! Реляционные данные отображаются на рисунке ниже:

  • Сам язык HTML имеет недостатки:
    • **Маркеры фиксированы и не могут быть изменены. Любая разметка на языке HTML может использоваться только с любой разметкой**
    • Сам по себе HTML-тег лишен смысла (любой контент в теге tr может быть вставлен, а не стандартизирован!!)
    • HTML не реализует истинную интернационализацию

XML-файл для решения вышеуказанных проблем, и если вы используете XML для описания взаимосвязи между приведенным выше изображением, это очень просто!


	<?xml version="1.0" encoding="UTF-8" ?>
	<中国>
	    <北京>
	        <海淀></海淀>
	        <丰台></丰台>
	    </北京>
	    <湖南>
	        <长沙></长沙>
	        <岳阳></岳阳>
	    </湖南>
	    <湖北>
	        <武汉></武汉>
	        <荆州></荆州>
	    </湖北>
	</中国>


Файлы XML также можно открыть в браузере:

Мы можем обнаружить, что XML может описывать очень сложные отношения данных.


Использование XML

①:Файлы конфигурации (пример: Tomcat's web.xml, server.xml...), XML могут четко описывать взаимосвязь между программами.

②:Для передачи данных между программами используется универсальный формат XML, что позволяет снизить сложность обмена данными!

③:Действуя как небольшая база данных, если наши данные иногда нужно настраивать вручную, для XML будет хорошим выбором действовать как небольшая база данных.Очевидно, что программа быстрее читает XML-файл напрямую, чем читает базу данных!


Техническая архитектура XML#

XML предназначен для того, чтобы «ничего не делать», XML-данные или XML-документы используются только для организации и хранения данных, а другие операции, такие как генерация данных, чтение, передача, доступ и т. д., не имеют ничего общего с самим XML!

Поэтому, если вы хотите работать с XML, вам нужно использовать технологии, отличные от XML.:

  • Установите правила для XML: в настоящее время обычно используется технология DTD или Schema, конечно, технология Schema более продвинута!
  • Анализ данных XML: обычно используется технология DOM или SAX, каждая из которых имеет свои преимущества.
  • Предоставление стилей: XML обычно используется для хранения данных, но дизайнеры имеют большие амбиции и хотят отображать данные (но никто не использует XML для отображения данных), поэтому существует расширяемый язык преобразования стилей XSLT (eXtensiable Stylesheet Language Transformation).

Синтаксис XML:

В документации указано:

  • Объявление XML помещается в первую строку XML.

  • версия ---- версия

  • кодирование -- кодирование

  • Автономный - используется самостоятельно - по умолчанию нет. Автоном указывает, что XML не является независимой, и если да, это означает, что независимо от времени этого XML-документа не может ссылаться на внешний файл спецификации DTD; если это нет, то документ XML не является независимым, который может ссылаться на Внешний документ Спецификации DTD.

  • Правильный формат декларации документа, положение атрибута менять нельзя!


	<?xml version="1.0" encoding="utf-8" standalone="no"?>


элемент

Во-первых, здесь объясняется концепция:Элементы и теги в XML относятся к одному и тому же! Не ведитесь на разные имена!

Элементы, требующие внимания:

  • Пробелы и новые строки, появляющиеся в элементах XML, обрабатываются как содержимое элемента.
  • Каждый XML-документ должен иметь ровно один корневой элемент.
  • элемент должен быть закрыт
  • Деликатный случай
  • Не могу пересечь гнездо
  • не может начинаться с цифры

Может показаться, что нужно знать о многом, но это просто вопрос запоминания:Синтаксис XML указан! Не пишите вскользь!


Атрибуты

Атрибуты являются частью элементов XML, и соглашение об именах такое же, как и для элементов XML!


	<!--属性名是name,属性值是china-->
	<中国 name="china">

	</中国>



Примечания

Комментарии аналогичны комментариям HTML.


	<!---->

CDATA

При записи файлов XML некоторый контент может не анализироваться и не выполняться механизмом синтаксического анализа, а обрабатываться как необработанный контент. В этом случае вы можете поместить это содержимое в область CDATA.Для содержимого в области CDATA синтаксический анализатор XML не будет их обрабатывать, а выведет напрямую.

грамматика:

	
	<![CDATA[
		...内容
	]]>


escape-символ

Для некоторых отдельных символов, если вы хотите отобразить их оригинальный стиль, вы также можете использовать экранированную форму для их обработки.

Инструкции по обработке

Инструкция по обработке, именуемая PI (инструкция по обработке). Инструкции по обработке используются, чтобы указать механизму синтаксического анализа, как анализировать содержимое XML-документа.

Например:

Вы можете использовать инструкцию xml-stylesheet в XML-документе, чтобы уведомить механизм синтаксического анализа XML и применить файл CSS для отображения содержимого XML-документа.

	<?xml-stylesheet type="text/css" href="1.css"?>

  • XML-код:



	<?xml version="1.0" encoding="UTF-8" ?>
	<?xml-stylesheet type="text/css" href="1.css"?>
	
	<china>
	    <guangzhou>
	        广州
	    </guangzhou>
	    <shenzhen>
	        深圳
	    </shenzhen>
	</china>


  • CSS-код:
	
	
	guangzhou{
	    font-size: 40px;
	}

  • Эффект:


XML API в JDK

①: JAXP (Java API для обработки XML): в основном отвечает за синтаксический анализ XML.

②: JAXB (архитектура Java для привязки XML): в основном отвечает за сопоставление XML с объектами Java.

Что такое парсинг XML

Как упоминалось в предыдущей главе об XML, XML предназначен для того, чтобы "ничего не делать". XML используется только для организации и хранения данных. Другие операции, такие как генерация, чтение, передача данных и т. д., не имеют ничего общего с самим XML!

Разбор XML — это чтение XML-данных!


Метод разбора XML

Анализ XML делится на два типа:

①: объектная модель документа dom (Document Object Model) — это способ, рекомендованный организацией W3C для разбора XML.

②: sax (Simple API For XML), это стандарт сообщества XML, его поддерживают почти все парсеры XML!

Операции синтаксического анализа XML

Из приведенного выше рисунка легко увидеть,Приложение не работает напрямую с документом XML, но синтаксический анализатор XML анализирует документ XML, а затем приложение обрабатывает результат анализа через интерфейс DOM или интерфейс SAX, предоставляемый синтаксическим анализатором XML, тем самым косвенно реализуя доступ к документам XML!

Связь между часто используемыми синтаксическими анализаторами и пакетами разработки синтаксического анализа выглядит следующим образом.:


Почему существует 3 комплекта разработки?

  • Пакет разработки jaxp поставляется с JDK, и его не нужно импортировать.
  • Поскольку jaxp Sun не идеален, был разработан Jdom. Анализ XML Если вы используете Jdom, вам необходимо импортировать пакет разработки
  • dom4j вызван разногласиями между разработчиками Jdom, dom4j был разработан группой разработчиков Jdom. Если вы используете Jdom для разбора XML, вам необходимо импортировать пакет разработки [теперь dom4j используется чаще всего! 】

jaxp

Хотя производительность jaxp при разборе XML и простота разработки не так хороши, как у dom4j, ноJaxp в любом случае является встроенным пакетом разработки JDK, нам нужно изучить!

Операция парсинга DOM

Синтаксический анализ DOM — это объектно-ориентированный API, который загружает содержимое XML в память и генерирует модель, соответствующую содержимому XML-документа! Когда синтаксический анализ будет завершен, в памяти будет сгенерировано дерево объектов DOM, соответствующее структуре XML-документа, чтобы документ можно было оперировать в виде узлов в соответствии со структурой дерева!

Проще говоря:Разбор DOM загружает XML-документ в память, а элементы, формирующие дерево DOM, существуют в виде объектов! Мы можем манипулировать XML-документами, манипулируя этими объектами!

  • Рисунок ниже хорошо иллюстрирует это.Как сгенерировать DOM-дерево, соответствующее содержимому XML-документа!


Поскольку данные XML-документа являются реляционными, узлы сгенерированного дерева DOM также являются реляционными:

  • Узел над узлом является родителем этого узла
  • Узлы ниже узла являются дочерними элементами этого узла.
  • Узлы на одном уровне с одним и тем же родителем являются братьями и сестрами.
  • Набор узлов следующего уровня узла - это потомки узла (потомки).
  • Родительский узел, прародительский узел и все, что выше узла, являются предками узла.

В синтаксическом анализе DOM есть несколько основных операционных интерфейсов:

  • Document【代表整个XML文档,通过Document节点可以访问XML文件中所有的元素内容! 】
  • Узел [Узел узла почти эквивалентен объекту обычного класса Java в интерфейсе операции XML, и многие основные интерфейсы реализовали его, как видно на следующей диаграмме взаимосвязей! 】
  • NodeList [представляет набор узлов, обычно набор дочерних узлов в узле! 】
  • NameNodeMap [представляет однозначное соответствие между группой узлов и их уникальными именами, в основном используемое для представления узлов атрибутов (в книге говорится, что это основной рабочий интерфейс, но я, кажется, им не пользуюсь! , эээ, когда я его использую, я снова заполню дыру!)]

График отношений между узлами:

  • Некоторым может быть трудно понять,Почему интерфейс Документа меньше, чем интерфейс Узла, э-э, я думаю так: Документ состоит из бесчисленного количества Узлов, поэтому я также могу считать Документ Узлом.!如果实在想不通:人家都这样设计了,你有种就不用啊! ! (Шутя.....)

Ну, не более чем BB с вами, давайте воспользуемся тем, какие способы DOM для разбора XML документы это!

  • Код XML-документа

	<?xml version="1.0" encoding="UTF-8" ?>
	<china>
	    <guangzhou >广州</guangzhou>
	    <shenzhen>深圳</shenzhen>
	    <beijing>北京</beijing>
	    <shanghai>上海</shanghai>
	</china>


  • Согласно блок-схеме разбора XML,Сначала нам нужно получить объект парсера!


	public class DomParse {
	
	    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {
	
	        //API规范:需要用一个工厂来造解析器对象,于是我先造了一个工厂!
	        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
	
	        //获取解析器对象
	        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
	
	        //获取到解析XML文档的流对象
	        InputStream inputStream = DomParse.class.getClassLoader().getResourceAsStream("city.xml");
	
	        //解析XML文档,得到了代表XML文档的Document对象!
	        Document document = documentBuilder.parse(inputStream);
	        
	    }
	}

  • Какова цель синтаксического анализа содержимого XML-документа? Это не что иное, как добавление, удаление, изменение и обход.Пока мы будем добавлять, удалять, изменять и проверять XML, это означает, что мы будем использовать парсинг DOM.!

траверс

  • Давайте еще раз взглянем на содержимое XML-документа: что, если мы захотим пройтись?:

  • Может быть, у нас есть две идеи:

    • ①: Посмотрите сверху вниз на содержимое XML-документа и выведите то, что видите! [Это именно то, что делает синтаксический анализ SAX]
    • ②: Разделите содержимое XML-документа на две части, одна часть имеет дочерние узлы, а другая часть не имеет дочерних узлов (то есть узлов элементов!). Сначала мы оцениваем, является ли это узлом элемента. Если это узел элемента, выведите его. Если это не узел элемента, получите набор дочерних узлов. Затем оцените, является ли набор дочерних узлов узлом элемента. Если это является узлом элемента, выведите его. Если это не узел элемента, получите его. к этому набору дочерних узлов.... хорошо, случайно рекурсивно...
  • Давайте пройдем документ XML. Для того, чтобы повторно повторно повторно повторно, давайте напишем его как метод (также лучше использовать рекурсион для реализации функций)!


	public class DomParse {
	
	    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {
	
	        //API规范:需要用一个工厂来造解析器对象,于是我先造了一个工厂!
	        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
	
	        //获取解析器对象
	        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
	
	        //获取到解析XML文档的File对象
	        InputStream inputStream = DomParse.class.getClassLoader().getResourceAsStream("city.xml");
	
	        //解析XML文档,得到了代表XML文档的Document对象!
	        Document document = documentBuilder.parse(inputStream);
	
	        //把代表XML文档的document对象传递进去给list方法
	        list(document);
	
	    }
	
	
	    //我们这里就接收Node类型的实例对象吧!多态!!!
	    private static void list(Node node) {
	
	        //判断是否是元素节点,如果是元素节点就直接输出
	        if (node.getNodeType() == Node.ELEMENT_NODE) {
	            System.out.println(node.getNodeName());
	        }
	
	        //....如果没有进入if语句,下面的肯定就不是元素节点了,所以获取到子节点集合
	        NodeList nodeList = node.getChildNodes();
	
	        //遍历子节点集合
	        for (int i = 0; i < nodeList.getLength(); i++) {
	
	            //获取到其中的一个子节点
	            Node child = nodeList.item(i);
	
	            //...判断该子节点是否为元素节点,如果是元素节点就输出,不是元素节点就再获取到它的子节点集合...递归了
	
	            list(child);
	        }
	        
	    }
	}


  • Эффект:


Запрос

Теперь все, что мне нужно сделать, это: прочитать текстовое содержимое узла guangzhou!



    private static void read(Document document) {

        //获取到所有名称为guangzhou节点
        NodeList nodeList = document.getElementsByTagName("guangzhou");
        
        //取出第一个名称为guangzhou的节点
        Node node = nodeList.item(0);
        
        //获取到节点的文本内容
        String value = node.getTextContent();

        System.out.println(value);

    }

  • Эффект:


Увеличивать

Теперь я хочу добавить еще один узел города (Ханчжоу), мне нужно сделать это:


    private static void add(Document document) {

        //创建需要增加的节点
        Element element = document.createElement("hangzhou");

        //向节点添加文本内容
        element.setTextContent("杭州");

        //得到需要添加节点的父节点
        Node parent = document.getElementsByTagName("china").item(0);

        //把需要增加的节点挂在父节点下面去
        parent.appendChild(element);

    }

  • Для этого я просто добавил узел под DOM-дерево памяти.Если вы хотите записать DOM-дерево в памяти в файл на жестком диске, вам нужен конвертер!

  • Получить конвертер также легко:


        //获取一个转换器它需要工厂来造,那么我就造一个工厂
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        
        //获取转换器对象
        Transformer transformer = transformerFactory.newTransformer();

  • Метод transform() для обновления дерева Dom в памяти до файла на жестком диске немного сложнее.!

  • Ему нужен объект экземпляра Source и объект экземпляра Result Что это за два интерфейса?

  • Так,Я пошел проверить API и обнаружил, что DomSource реализует интерфейс Source.Это не парсинг Dom, который мы используем, а затем посмотрите на метод построения, похоже!

  • И SteamResult реализует интерфейс Result, некоторые люди подумают, DomResult также реализует интерфейс Result, почему бы не использовать DomResult? Что мы сейчас делаем, так это обновляем дерево Домов в памяти до файла на жестком диске.Конечно, мы используем StreamResult!

  • Полный код выглядит следующим образом:


    private static void add(Document document) throws TransformerException {

        //创建需要增加的节点
        Element element = document.createElement("hangzhou");

        //向节点添加文本内容
        element.setTextContent("杭州");

        //得到需要添加节点的父节点
        Node parent = document.getElementsByTagName("china").item(0);

        //把需要增加的节点挂在父节点下面去
        parent.appendChild(element);

        //获取一个转换器它需要工厂来造,那么我就造一个工厂
        TransformerFactory transformerFactory = TransformerFactory.newInstance();

        //获取转换器对象
        Transformer transformer = transformerFactory.newTransformer();

        //把内存中的Dom树更新到硬盘中
        transformer.transform(new DOMSource(document),new StreamResult("city.xml"));
    }

  • Эффект:


Только что добавленный узел находится в конце китайского узла, и теперь яЯ хочу указать узел, который будет добавлен перед пекинским узлом, делается так:



    private static void add2(Document document) throws TransformerException {

        //获取到beijing节点
        Node beijing = document.getElementsByTagName("beijing").item(0);

        //创建新的节点
        Element element = document.createElement("guangxi");

        //设置节点的文本内容
        element.setTextContent("广西");

        //获取到要创建节点的父节点,
        Node parent = document.getElementsByTagName("china").item(0);

        //将guangxi节点插入到beijing节点之前!
        parent.insertBefore(element, beijing);

        //将内存中的Dom树更新到硬盘文件中
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.transform(new DOMSource(document), new StreamResult("city.xml"));
        
    }

  • Эффект:


Удалить

Теперь я хочу удалить узел beijing!



    private static void delete(Document document) throws TransformerException {

        //获取到beijing这个节点
        Node node = document.getElementsByTagName("beijing").item(0);

        //获取到父节点,然后通过父节点把自己删除了
        node.getParentNode().removeChild(node);

        //把内存中的Dom树更新到硬盘文件中
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.transform(new DOMSource(document), new StreamResult("city.xml"));


    }

  • Эффект:

Исправлять

Измените текстовое содержимое узла guangzhou на Hello Guangzhou.


    private static void update(Document document) throws TransformerException {

        //获取到guangzhou节点
        Node node = document.getElementsByTagName("guangzhou").item(0);

        node.setTextContent("广州你好");

        //将内存中的Dom树更新到硬盘文件中
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.transform(new DOMSource(document), new StreamResult("city.xml"));


    }


  • Эффект:


Свойства операции

Документы XML могут иметь значения атрибутов, теперь нам нужны атрибуты на узле Гуанчжоу.

    private static void updateAttribute(Document document) throws TransformerException {

        //获取到guangzhou节点
        Node node = document.getElementsByTagName("guangzhou").item(0);

        //现在node节点没有增加属性的方法,所以我就要找它的子类---Element
        Element guangzhou = (Element) node;

        //设置一个属性,如果存在则修改,不存在则创建!
        guangzhou.setAttribute("play", "gzchanglong");

        //如果要删除属性就用removeAttribute()方法


        //将内存中的Dom树更新到硬盘文件中
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.transform(new DOMSource(document), new StreamResult("city.xml"));


    }

  • Эффект:


SAX-анализ

SAX использует для доступа последовательный режим, который является быстрым способом чтения XML-данных. Когда синтаксический анализатор SAX работает, он инициирует серию событий SAX. Использование обработки событий для анализа XML-файлов и использование SAX для анализа XML-документов состоит из двух частей:Парсер и обработчик событий

sax - это механизм push, вы создаете парсер sax, парсер сообщает вам, когда находит содержимое в документе xml (отправляет вам событие).Как обращаться с содержимым, зависит от программиста.

Когда синтаксический анализатор выполняет синтаксический анализ<?xml version="1.0" encoding="UTF-8" standalone="no"?>Когда вы объявляете голову, это запускает события. Решить<china>Событие также запускается, когда запускается заголовок элемента! Это:Когда синтаксический анализатор SAX используется для сканирования XML-документа (то есть объекта Document), события будут запускаться в начале и в конце, а также в начале и в конце элементов, а соответствующие методы будут вызываться в соответствии с различными Мероприятия!


Сначала мы ещеСначала получите парсер SAXБар!


        //要得到解析器对象就需要造一个工厂,于是我造了一个工厂
        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
        
        //获取到解析器对象
        SAXParser saxParse = saxParserFactory.newSAXParser();


  • При вызове метода анализа объекта разброса вам нужно больше, чем просто путь к документу XML! Также нужен обработчик событий!

  • Процессоры событий написаны нашими программистами, которые обычно наследуют класс Defaulthandler, переписывая следующие пять методов:

    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
    }

    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
    }

  • Получите синтаксический анализатор и вызовите синтаксический анализатор для анализа кода XML-документа:


    public static void main(String[] args) throws Exception{

        //要得到解析器对象就需要造一个工厂,于是我造了一个工厂
        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();

        //获取到解析器对象
        SAXParser saxParse = saxParserFactory.newSAXParser();

        //获取到XML文档的流对象
        InputStream inputStream = SAXParse.class.getClassLoader().getResourceAsStream("city.xml");

        saxParse.parse(inputStream, new MyHandler());

    }

  • Код обработчика событий:

	public class MyHandler extends DefaultHandler {
	    @Override
	    public void startDocument() throws SAXException {
	        System.out.println("我开始来扫描啦!!!!");
	    }
	
	    @Override
	    public void endDocument() throws SAXException {
	
	        System.out.println("我结束了!!!!");
	    }
	
	    @Override
	    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

			//如果要解析出节点属性的内容,也非常简单,只要通过attributes变量就行了!

			//输出节点的名字!
	        System.out.println(qName);
	    }
	
	    @Override
	    public void endElement(String uri, String localName, String qName) throws SAXException {
	
	        System.out.println(qName);
	    }
	
	    @Override
	    public void characters(char[] ch, int start, int length) throws SAXException {
	
	        System.out.println(new String(ch,start,length));
	    }
	}

  • мы обнаруживаем,Код обработчика событий очень прост, и так легко пройтись по всему XML-документу!

  • Если вы хотите запросить содержимое одного узла, это также очень просто! Просто проверьте, совпадают ли имена в методе startElement()!

  • Теперь я просто хочу запросить содержимое узла Гуанчжоу:


    //定义一个标识量,用于指定查询某个节点的内容
    boolean flag = false;

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

        //如果节点名称是guangzhou,我才输出,并且把标识量设置为true
        if (qName == "guangzhou") {
            System.out.println(qName);
            flag = true;
        }
    }


    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        //只有在flag为true的情况下我才输出文本的内容
        if (flag == true) {
            System.out.println(new String(ch, start, length));

        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {

        //在执行到元素的末尾时,不要忘了将标识量改成false
        if (qName == "guangzhou" && flag == true) {
            System.out.println(qName);
            flag = false;

        }
    }

  • Эффект:


Разница между разбором DOM и SAX:

Анализ DOM считывает весь XML-документ, формирует дерево DOM в памяти и легко добавляет, удаляет или изменяет содержимое XML-документа. Но если содержимое XML-документа слишком велико, это приведет к переполнению памяти!

Синтаксический анализ SAX использует частичное чтение, которое может обрабатывать большие файлы, но может последовательно анализировать файлы от начала до конца и не поддерживает добавление, удаление и изменение файлов.

Существуют очевидные различия между анализом DOM и SAX, и совершенно ясно, когда использовать DOM или SAX.


dom4j

Dom4j — это очень хороший Java XML API с отличной производительностью, мощными функциями и чрезвычайно простым в использовании.

Зачем нужен дом4дж

  • Недостатки dom: больше памяти

  • Недостатки sax: можно читать только файлы xml, их нельзя изменять, добавлять или удалять.

  • dom4j: может не только повысить эффективность, но и выполнять грубые операции

Поскольку dom4j не является продуктом компании Sun, нам необходимо импортировать пакет разработки для разработки dom4j.


Получить парсер для dom4j

  • Чтобы использовать dom4j для добавления, удаления, изменения и проверки XML-документов, вам необходимо получить парсер dom4j.

        //获取到解析器
        SAXReader saxReader = new SAXReader();

        //获取到XML文件的流对象
        InputStream inputStream = DOM4j.class.getClassLoader().getResourceAsStream("1.xml");

        //通过解析器读取XML文件
        Document document = saxReader.read(inputStream);
        

Получить объект документа

Мы все знаем, что Document представляет XML-документ.Как правило, мы начинаем с объекта Document для выполнения операций CRUD (добавление, удаление, изменение и поиск)!

Получает объект Document тремя способами:

①: Прочитайте файл XML и получите объект документа (наиболее часто используемый)

SAXReader reader = new SAXReader();
Document document = reader.read(new File("input.xml"));

②: Проанализируйте текст в форме XML, чтобы получить объект документа.

	
	String text = "<members></members>";
	Document document=DocumentHelper.parseText(text);


③: активно создавать объект документа.


Document document =DocumentHelper.createDocument();

//创建根节点
Element root = document.addElement("members");

Важное предложение от CRUD:

Чтобы прочитать данные документа XML, корневой элемент получается через документ, а затем другие узлы получаются через корневой элемент, чтобы работать!

Если структура XML состоит из нескольких слоев, ее необходимо получать слой за слоем!

Запрос


    @Test
    public void read() throws DocumentException {

        //获取到解析器
        SAXReader saxReader = new SAXReader();

        //获取到XML文件的流对象
        InputStream inputStream = dom4j11.class.getClassLoader().getResourceAsStream("1.xml");
   
        //通过解析器读取XML文件
        Document document = saxReader.read(inputStream);

        //获取得到根节点
        Element root = document.getRootElement();

        //获取得到name节点
        Element name = root.element("name");

        //得到了name节点,就可以获取name节点的属性或者文本内容了!
        String text = name.getText();

        String attribute = name.attributeValue("littleName");

        System.out.println("文本内容是:" + text);
        System.out.println("属性内容是:" + attribute);
        
    }


  • XML-файл выглядит следующим образом:

	<?xml version="1.0" encoding="UTF-8" ?>
	     <person>
	    <name littleName="fucheng">zhongfucheng</name>
	    <age>20</age>
	</person>


  • Эффект:

  • Запрос многослойной структуры:

        //获取得到根节点
        Element root = document.getRootElement();

        //一层一层地获取到节点
        Element element = root.element("guangdong").element("guangzhou").element("luogang");

        String value = element.getText();

        System.out.println(value);

  • XML-файл и результат:


Увеличивать

В DOM4j должен быть файл дерева DOM в памяти, записанный на жесткий диск, но также иметь поддержку конвертера!

dom4j предоставляет нам XMLWriter для обновления XML-документов.Как правило, когда мы создаем XMLWriter, мы задаем два параметра: Writer и OutputFormat.

Какая польза от этого OutputFormat? фактическиОн предназначен для указания формата и формата кодирования XML с обратной записью.. Внимательные друзья обнаружат, что мы находимся под пакетом jaxp выше.Используйте класс Transformer, проанализированный dom, для обновления дерева DOM в памяти до файлового жесткого диска, который не имеет формата.! Если не верите мне, вернитесь и посмотрите!Когда это выводит FFORMAT, вы можете позволить нам обновить документы XML также могут отформатировать с!


        //创建带有格式的对象
        OutputFormat outputFormat = OutputFormat.createPrettyPrint();

        //设置编码,默认的编码是gb2312,读写的编码不一致,会导致乱码的!
        outputFormat.setEncoding("UTF-8");

        //创建XMLWriter对象
        XMLWriter xmlWriter = new XMLWriter(new FileWriter("2.xml"), outputFormat);

        //XMLWriter对象写入的是document
        xmlWriter.write(document);

        //关闭流
        xmlWriter.close();

  • Ниже мыСоздайте новый узел имени под узлом человека. Полный код выглядит следующим образом:!


	@Test
    public void add() throws Exception {

        //获取到解析器
        SAXReader saxReader = new SAXReader();

        //获取到XML文件的流对象
        InputStream inputStream = dom4j11.class.getClassLoader().getResourceAsStream("1.xml");

        //通过解析器读取XML文件
        Document document = saxReader.read(inputStream);

        //创建出新的节点,为节点设置文本内容
        Element newElement = DocumentHelper.createElement("name");
        newElement.setText("ouzicheng");

        //获取到根元素
        Element root = document.getRootElement();

        //把新创建的name节点挂在根节点下面
        root.add(newElement);

        //创建带有格式的对象
        OutputFormat outputFormat = OutputFormat.createPrettyPrint();

        //设置编码,默认的编码是gb2312,读写的编码不一致,会导致乱码的!
        outputFormat.setEncoding("UTF-8");

        //创建XMLWriter对象
        XMLWriter xmlWriter = new XMLWriter(new FileWriter("2.xml"), outputFormat);

        //XMLWriter对象写入的是document
        xmlWriter.write(document);

        //关闭流
        xmlWriter.close();


    }

  • Эффект следующий, форматируется!


Добавьте узел в указанное место! Теперь все, что я хочу, это добавить узел перед атрибутом возраста!


        //创建一个新节点
        Element element = DocumentHelper.createElement("name");
        element.setText("ouzciheng");

        //获取得到person下所有的节点元素!
        List list = document.getRootElement().elements();

        //将节点添加到指定的位置上
        list.add(1, element);


  • Изображение эффекта:



Исправлять

  • Я не буду публиковать код для XMLWriter и получения объекта Document, в любом случае это одно и то же!

        //获取得到age元素
        Element age = document.getRootElement().element("age");
        age.setText("9999");


  • Эффект следующий:


Удалить

  • Я не буду публиковать код для XMLWriter и получения объекта Document, в любом случае это одно и то же!

        //获取得到age节点
        Element age = document.getRootElement().element("age");

        //得到age节点的父节点,使用父节点的remove删除age节点!
        age.getParent().remove(age);

  • Эффект:


XPATH

Что такое XPATH

XPath — это язык для поиска информации в XML-документах. XPath используется для навигации по элементам и атрибутам в XML-документах.

Зачем нам нужно использовать XPATH

Когда мы используем dom4j выше,Чтобы получить определенный узел, начните с корневого узла и выполняйте поиск слой за слоем, что немного проблематично.!

Если мы используем язык XPATH, очень удобно получать узлы XML!


Быстрый старт

Чтобы использовать XPATH, вам нужно импортировать пакет разработки jaxen-1.1-beta-7.Для начала давайте посмотрим на официальную документацию.

  • Документы XPATH очень интернациональны, даже на китайском языке.

  • В документе XPATH есть много примеров, очень хочется их изучить, просто посмотрите на них, и вы все поймете!

  • Давайте воспользуемся технологией XPATH для чтения информации XML-файла. XML-документ выглядит следующим образом:

  • Раньше мы сначала получали корневой узел, затем узел Гуандун, а затем узел Гуанчжоу, а затем мы могли прочитать узел Тяньхэ или узел Луоган.Насколько удобно использовать XPATH!

        //直接获取到luogang节点
        org.dom4j.Node node =  document.selectSingleNode("//luogang");

        //获取节点的内容
        String value = node.getText();

        System.out.println(value);

  • Эффект:

Какой тип узла получить и как должна совпадать строка XPATH, вы можете узнать, просмотрев документацию, поэтому я не буду здесь вдаваться в подробности. !


Если в статье есть какие-либо ошибки, пожалуйста, поправьте меня, и мы сможем общаться друг с другом. Студенты, которые привыкли читать технические статьи о WeChat, могут обратить внимание на публичный аккаунт WeChat: Java3y.