Как парсить XML-файл с использованием Java

JavaJavaBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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

Введение в структуру XML-файлов

XML (Extensible Markup Language, расширяемый язык разметки) - это широко используемый формат обмена данными, который предоставляет структурированный способ представления и хранения информации. XML-файлы состоят из элементов, атрибутов и текстового содержимого, которые вместе образуют иерархическую структуру.

Понимание структуры XML

XML-файл обычно состоит из следующих ключевых компонентов:

  • Объявление XML: Здесь указывается версия XML, обычно <?xml version="1.0" encoding="UTF-8"?>.
  • Элементы: Это основные строительные блоки XML-документа, представленные тегами, заключенными в угловые скобки, например, <book> и </book>.
  • Атрибуты: Они предоставляют дополнительную информацию об элементе и определяются в открывающем теге, например, <book id="1">.
  • Текстовое содержимое: Это фактические данные или информация, содержащаяся в элементе, например, <title>The Catcher in the Rye</title>.
  • Иерархия: XML-элементы могут быть вложены друг в друга, чтобы создать иерархическую структуру, где дочерние элементы содержатся в родительских элементах.
graph TD A[XML Document] --> B[XML Declaration] A --> C[Root Element] C --> D[Child Element] D --> E[Attribute] D --> F[Text Content]

Пространства имен XML

Пространства имен XML предоставляют способ уникально идентифицировать элементы и атрибуты в XML-документе. Они определяются с использованием атрибута xmlns и могут быть использованы для избежания конфликтов имен между различными XML-воображаемыми словарями.

<book xmlns="http://example.com/books">
  <title>The Catcher in the Rye</title>
  <author>J.D. Salinger</author>
</book>

В этом примере атрибут xmlns определяет пространство имен для элемента book и его дочерних элементов.

Понимая основную структуру и концепции XML, вы будете лучше подготовлены к парсингу и работе с XML-данными с использованием Java.

Парсинг XML-файлов с использованием Java API

Java предоставляет несколько API для парсинга XML-файлов, каждый из которых имеет свои преимущества и области применения. Наиболее часто используемые API для парсинга XML в Java следующие:

DOM (Document Object Model, объектная модель документа) - парсер

DOM-парсер создает в памяти представление всего XML-документа в виде древовидной структуры. Это позволяет произвольно обращаться к и манипулировать XML-данными, но может потреблять много памяти при обработке больших файлов.

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("example.xml");

SAX (Simple API for XML, простой API для XML) - парсер

SAX-парсер является событийно-управляемым парсером, который обрабатывает XML-документ последовательно, вызывая обратные вызовы для различных событий парсинга. Это делает его более экономичным по памяти, чем DOM-парсер, но он не позволяет произвольно обращаться к XML-данным.

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse("example.xml", new MyXMLHandler());

StAX (Streaming API for XML, потоковый API для XML) - парсер

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

XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader = factory.createXMLStreamReader(new FileInputStream("example.xml"));

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

Практические примеры парсинга XML

В этом разделе мы рассмотрим несколько практических примеров парсинга XML-файлов с использованием Java API, которые были рассмотрены ранее.

Парсинг простого XML-файла

Начнем с простого XML-файла с именем books.xml:

<?xml version="1.0" encoding="UTF-8"?>
<library>
  <book>
    <title>The Great Gatsby</title>
    <author>F. Scott Fitzgerald</author>
    <year>1925</year>
  </book>
  <book>
    <title>To Kill a Mockingbird</title>
    <author>Harper Lee</author>
    <year>1960</year>
  </book>
</library>

Используя DOM-парсер, мы можем распарсить этот файл и извлечь информацию о книгах:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("books.xml");

NodeList bookNodes = document.getElementsByTagName("book");
for (int i = 0; i < bookNodes.getLength(); i++) {
    Node bookNode = bookNodes.item(i);
    System.out.println("Title: " + bookNode.getElementsByTagName("title").item(0).getTextContent());
    System.out.println("Author: " + bookNode.getElementsByTagName("author").item(0).getTextContent());
    System.out.println("Year: " + bookNode.getElementsByTagName("year").item(0).getTextContent());
}

Парсинг сложного XML-файла

Теперь рассмотрим более сложный XML-файл, который включает пространства имен:

<?xml version="1.0" encoding="UTF-8"?>
<library xmlns="http://example.com/library"
         xmlns:dc="http://purl.org/dc/elements/1.1/">
  <book>
    <dc:title>The Catcher in the Rye</dc:title>
    <dc:creator>J.D. Salinger</dc:creator>
    <dc:date>1951</dc:date>
  </book>
  <book>
    <dc:title>1984</dc:title>
    <dc:creator>George Orwell</dc:creator>
    <dc:date>1949</dc:date>
  </book>
</library>

Для парсинга этого файла и доступа к элементам с пространствами имен можно использовать следующий код:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("books.xml");

NodeList bookNodes = document.getElementsByTagNameNS("http://example.com/library", "book");
for (int i = 0; i < bookNodes.getLength(); i++) {
    Node bookNode = bookNodes.item(i);
    System.out.println("Title: " + bookNode.getElementsByTagNameNS("http://purl.org/dc/elements/1.1/", "title").item(0).getTextContent());
    System.out.println("Author: " + bookNode.getElementsByTagNameNS("http://purl.org/dc/elements/1.1/", "creator").item(0).getTextContent());
    System.out.println("Year: " + bookNode.getElementsByTagNameNS("http://purl.org/dc/elements/1.1/", "date").item(0).getTextContent());
}

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

Заключение

В этом руководстве вы узнали, как парсить XML-файлы с использованием Java API. Мы рассмотрели основы структуры XML-файлов, изучили различные подходы к парсингу на Java и предоставили практические примеры, чтобы помочь вам начать работу. Освоив эти техники, вы сможете эффективно обрабатывать и извлекать данные из XML-файлов в своих Java-проектах.