Node js читает XML-файл

Обновлено: 01.07.2024

Поскольку многие ответы API представлены в формате XML, мы пересмотрим синтаксический анализ XML в Node.js, чтобы помочь вам быстрее получать интересные данные.

В этом руководстве предполагается, что вы уже ознакомились с нашим руководством по началу работы с Node.js и знакомы с тем, как работает наш SDK для Node.js.

В стандартной библиотеке Node не предусмотрены возможности синтаксического анализа XML. В этом примере используется Node ElementTree, реализация Node популярной библиотеки Python XML. Его можно установить с помощью диспетчера пакетов Node, выполнив следующую команду в каталоге, содержащем каталог node_modules с разархивированным SDK Temboo.

Получить XML-ответ

1 Войдите в Temboo и перейдите в Yahoo > Weather > GetWeatherByAddress Choreo в нашей библиотеке.

2 Введите местоположение в адресную строку и нажмите «Создать код», чтобы протестировать Choreo с нашего веб-сайта.

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

Проанализируйте его в Node.js

4 Создайте новый файл Node.js и скопируйте в него приведенный ниже код. Шаги 5 и 6 объясняют, что происходит в коде.

5 Сначала нам нужно преобразовать XML-ответ от Yahoo в объект w3c.Document.

6 Далее нам нужно извлечь нужные данные из XML-файла. Чтобы понять, как она организована, полезно взглянуть на структуру XML-файла. Нам нужны атрибуты text и temp. Вы можете найти их в:
.

7 Вот и все. Вы можете запустить код в своей среде IDE Node.js, чтобы попробовать его. Вы должны увидеть текст погодных условий и температуру, напечатанные в консоли.

Что дальше?

Теперь вы готовы решать любые задачи по анализу XML в Node.js. В нашей библиотеке из более чем 2000 хореографий вы можете найти множество XML-файлов для экспериментов.

После того как вы запустили и запустили свой код, вы готовы двигаться дальше и делать больше. От мониторинга запущенных приложений до переноса сгенерированного кода Temboo в предпочтительную среду разработки и обмена им с коллегами, сотрудниками и друзьями — мы обеспечим вас.

Чтение и запись XML в Node.js

Когда вы думаете о Node.js, XML, вероятно, не первое, что приходит на ум. Но бывают случаи, когда вам может понадобиться читать или писать XML из приложения Node.js. Не случайно поиск «XML» в npm возвращает более 3400 результатов; существует значительная коллекция связанных с XML пакетов, которые специализируются на различных способах работы с XML.

В этой статье мы рассмотрим некоторые реальные примеры использования XML с использованием некоторых из самых популярных доступных пакетов npm, в том числе:

Обратите внимание, что примеры кода в этой статье предназначены для демонстрации. Подробный рабочий пример кода доступен по адресу briandesousa/node-xml-demo.

Если вы хотите следовать инструкциям в этой статье, вы можете начать с создания приложения Express с помощью экспресс-генератора. Выберите механизм представления Pug (примеры кода представления написаны как шаблоны Pug).

Веб-службы XML-RPC и SOAP раньше были стандартом для обмена данными между приложениями, но API-интерфейсы JSON (например, REST, GraphQL) почти свергли службы XML.

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

Один из самых популярных XML-пакетов — xml2js, а одна из самых популярных платформ приложений для Node.js — Express. Естественно, существует пакет промежуточного программного обеспечения Express, express-xml-bodyparser, который связывает эти два компонента вместе. Давайте построим экспресс-маршрут, который может принимать XML.

Во-первых, нам нужно установить пакет express-xml-bodyparser:

Затем добавьте промежуточное ПО express-xml-bodyparser в приложение Express. По умолчанию промежуточное ПО будет анализировать любые входящие запросы, если заголовок Content-Type запроса имеет значение text/xml .

Добавьте маршрут /xml2js/customer, который получает XML-запрос:

Мы сделали специальное демо для .
Нет, правда. Нажмите здесь, чтобы проверить это .

Чтобы проверить наш маршрут, мы можем написать код JavaScript на стороне клиента, который отправляет XML-запрос:

Маршрут возвращает XML-ответ. Если вы посмотрите на вывод консоли сервера, вы увидите текст запроса, полученный сервером:

Подождите, вы заметили разницу между полученным необработанным XML и объектом, возвращенным промежуточным программным обеспечением express-xml-bodyparser?

Необработанный XML-код имеет XML-тег retrieveCustomer в верхнем регистре, но ключ retrievecustomer в объекте JSON написан строчными буквами. Это происходит из-за того, что промежуточное ПО express-xml-bodyparser настраивает синтаксический анализатор xml2js, в том числе задает параметр для преобразования всех тегов XML в нижний регистр.

Мы хотим, чтобы свойства объекта JSON точно соответствовали тегам XML в исходном запросе. К счастью, мы можем указать наши собственные параметры xml2js и переопределить значения по умолчанию, предоставленные промежуточным программным обеспечением.

Измените промежуточное ПО xmlparser, которое было добавлено в приложение Express ранее, чтобы включить объект конфигурации с параметром normalizeTags, для которого задано значение false :

Повторно запустите клиентский код и просмотрите журнал консоли сервера. Имена тегов теперь должны совпадать между необработанным XML и проанализированным объектом JSON:

Пакет xml2js предоставляет несколько других параметров, позволяющих настроить анализ XML. Полный список опций см. в xml2js на npm.

Проверка XML с помощью схем

Другое распространенное использование XML — это формат для обмена данными между различными приложениями, иногда между разными организациями. Обычно XML-схема (XSD) используется для определения структуры XML-сообщения, которое каждое приложение должно отправлять и получать. Каждое приложение проверяет входящие XML-данные на соответствие схеме.

Несмотря на то, что для работы с XML доступно довольно много пакетов npm, варианты немного более ограничены, когда вам также требуется проверка XML-схемы. Давайте взглянем на пакет libxmljs2, который поддерживает проверку XML-схемы. Мы напишем код для загрузки XML-схемы из файловой системы сервера и используем ее для проверки некоторых входящих XML-данных.

Начните с создания XML-схемы в каталоге schemas в корневом каталоге вашего приложения:

Установите пакет libxmljs2:

Создайте новый маршрут /libxmljs2/validateSessionXml:

Совет. Если вы все еще используете промежуточное ПО express-xml-bodyparser из предыдущего примера, вам может потребоваться изменить строку 2, чтобы использовать req.rawBody вместо req.body, чтобы обойти xlm2js и получить доступ к вместо этого необработанная строка запроса.

В строке 14 функция parseXml() библиотеки libxmljs2 анализирует XML в запросе. Он возвращает объект libxmljs.Document, который предоставляет функцию validate(), которая принимает другой libxmljs.Document, содержащий XML-схему. Функция проверки вернет либо true, либо строку, содержащую список ошибок проверки. В строках 23–27 мы возвращаем соответствующий ответ на основе результата проверки.

Функция loadXmlSchema() в строке 30 загружает схему XML из файловой системы сервера, используя стандартный путь Node.js и модули fs. И снова мы используем функцию parseXml() для анализа содержимого файла схемы в объект libxmljs.Document. XML-схемы — это просто XML-документы в конце концов.

Теперь, когда мы реализовали маршрут, мы можем написать простой клиентский код JavaScript для проверки нашего маршрута с допустимым XML-запросом:

Мы также можем отправить недопустимый XML-запрос и наблюдать возвращаемые ошибки проверки:

Сообщения об ошибках, возвращаемые функцией validate() библиотеки libxmljs2, довольно подробные; однако формат сообщений об ошибках затрудняет анализ отдельных сообщений об ошибках и преобразование их в удобный для пользователя текст. Помимо этого, для проверки XML по схеме требуется очень мало кода.

Управление содержимым HTML

Что делать, если вашему приложению необходимо манипулировать HTML? В отличие от примеров, которые мы рассмотрели до сих пор, HTML технически не соответствует спецификации XML.

Существует несколько пакетов npm, которые специализируются на обработке нюансов HTML по сравнению с XML. Одним из них является Чирио. Давайте посмотрим, как мы можем использовать Cheerio для чтения, обработки и возврата фрагмента HTML.

Начните с установки пакета Cheerio:

Создайте новый маршрут /cheerio/highlightTable:

В строке 8 свойство запроса encodedHtml декодируется с помощью встроенной функции decodeURI. Мы должны кодировать строку HTML при отправке и получении в запросе JSON, чтобы избежать конфликтов специальных символов, таких как двойные кавычки, с синтаксисом JSON.

В строке 12 функция load() Cheerio используется для синтаксического анализа фрагмента HTML. Эта функция возвращает объект селектора с API, который почти идентичен основному API jQuery.

Затем селектор используется в строках 15–25 для поиска и извлечения текста во всех ячейках таблицы во фрагменте HTML. Функция prop(), предоставляемая селектором, используется в строках 21 и 23 для изменения фрагмента HTML путем добавления новых атрибутов стиля.

В строке 31 селектор используется для извлечения элемента body из фрагмента HTML и возврата его в виде строки HTML. Даже если HTML-фрагмент, который был передан в запросе, не содержал внешних тегов или тегов, Cheerio автоматически превращает HTML-фрагмент в правильно структурированный HTML-документ.Это происходит при вызове функции load().

Наконец, строка HTML кодируется и отправляется обратно клиенту в строке 32.

Давайте напишем клиентский JavaScript для проверки маршрута:

В строке 22 фрагмент HTML кодируется с помощью встроенной в браузер функции encodeURI, аналогично тому, как мы декодировали его на стороне сервера в предыдущем примере.

Вы заметите несколько различий между исходным отправляемым HTML-фрагментом (строки 3–16) и измененным HTML-фрагментом, который возвращается (показано в комментариях к строкам 32–46):

Создание изображений SVG

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

Во-первых, краткое введение в масштабируемую векторную графику (SVG). SVG — это формат изображения на основе XML, поддерживаемый всеми основными браузерами. SVG XML состоит из ряда элементов, определяющих различные типы фигур. Стили CSS могут быть включены в каждую фигуру, чтобы определить ее внешний вид. Обычно вы используете инструмент для создания SVG XML, а не программируете его вручную, но, учитывая, что изображения SVG — это просто XML, возможно манипулирование изображениями с помощью JavaScript.

Мы собираемся создать маршрут, который принимает три цвета, загружает изображение SVG из файловой системы сервера, применяет цвета к определенным фигурам на изображении и возвращает его клиенту для рендеринга. Мы собираемся использовать пакет svgson для преобразования между SVG XML и JSON, чтобы упростить код, который нам нужно написать для управления изображением.

Начните с установки пакета svgson:

Создайте новый маршрут /svgson/updateSVGImageColors:

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

В строках 5–8 модули parse и stringify импортируются из пакета svgson. Эти имена модулей довольно общие, но мы можем использовать деструктуризацию объектов, чтобы дать им более краткие имена, такие как svgsonParse и svgsonStingify .

В строке 17 функция loadSVGImageXML() используется для загрузки содержимого предопределенного изображения SVG из файловой системы сервера с использованием собственных модулей Node.js. Используемое изображение — paint.svg. Вот как это выглядит для начала:

Черно-белое изображение краски и кисти

В строках 20–36 происходит магия манипулирования изображениями. XML SVG преобразуется в объект JSON. Стандартный JavaScript используется для навигации по дереву объектов, чтобы найти три фигуры пути, которыми мы хотим манипулировать. Вот сравнение дерева объектов JSON (слева) с SVG XML (справа), чтобы помочь визуализировать его. Обратите внимание, что некоторые элементы были удалены для краткости.

Выделение кода Дерево объектов SVG JSON по сравнению с SVG XML

Вспомогательная функция updatePathStyleById(), вызываемая в строках 27–29, находит фигуру пути по ее идентификатору и заменяет ее стиль заливки новым стилем заливки, созданным с использованием цветов, указанных в запросе.

Объект SVG JSON преобразуется обратно в строку SVG XML в строке 32 и возвращается клиенту в строке 35.

Давайте напишем клиентский JavaScript для проверки маршрута:

Если бы нам нужно было визуализировать возвращенный SVG XML, это выглядело бы так:

Зеленая, синяя и красная краска с помощью кисти

Подведение итогов: вам уже достаточно XML?

Мы рассмотрели несколько распространенных способов использования XML, начиная от скучного старого обмена данными на основе XML и заканчивая манипулированием изображениями SVG. Вот краткое изложение пакетов npm, которые мы рассмотрели, и основных особенностей, которые их отличают.

  • Может выполнять двунаправленное преобразование между XML и JavaScript.
  • Предоставляет несколько параметров, которые можно использовать для изменения способа анализа XML.
  • Хорошо сочетается с Express с помощью промежуточного ПО express-xml-bodyparser
  • Может анализировать и проверять XML по схемам XML.
  • Специализируется на анализе HTML и управлении им.
  • Можно использовать для загрузки документов HTML или XML.
  • Прощение по замыслу; добавит отсутствующие теги HTML, чтобы убедиться, что HTML действителен.
  • Может выполнять двунаправленное преобразование между изображениями SVG (XML) и JSON.
  • Облегчает работу с изображением SVG с помощью JavaScript.

Только 200
Отслеживание сбоев и медленных сетевых запросов в рабочей среде

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

LogRocket позволяет вашему приложению записывать базовые показатели производительности, такие как время загрузки страницы, время до первого байта, медленные сетевые запросы, а также регистрировать действия/состояние Redux, NgRx и Vuex. Начать мониторинг бесплатно.


В Node.js нет встроенной библиотеки для чтения XML. Для чтения XML можно использовать популярный модуль xml2js.

Установите xml2js:

Установленный модуль предоставляет объект Parser, который затем используется для чтения XML.

Важно отметить, что атрибуты узла перечислены под ключом $ по умолчанию. Здесь во время создания объекта предоставляется возможность переопределить этот параметр по умолчанию. В этом примере атрибуты будут храниться под ключом ATTR. Это делается просто для улучшения читабельности.

Для приведенного ниже XML:

Выходным результатом приведенного выше кода будет:

Обратите внимание, что имена тегов возвращаются в виде массива, а не объекта.

Чтение XML из URL

Чтение больших файлов XML с помощью потоков

Иногда файлы XML становятся огромными, от сотен МБ до ГБ. Чтение таких больших файлов путем загрузки содержимого в память за один раз может иметь пагубные последствия для системы.

Решение этой проблемы состоит в том, чтобы читать большие файлы как потоки. xml2js не имеет этой функции, поэтому используется другой модуль node-xml-stream.

Модуль импортируется и используется, как показано ниже:

С объектом синтаксического анализатора node-xml-stream связаны следующие события:

  • opentag — срабатывает при обнаружении открывающего узла
  • closetag — срабатывает при обнаружении закрывающего узла
  • текст — срабатывает, когда внутри узла встречается текст
  • cdata — срабатывает при обнаружении символьных данных (CDATA)
  • instructions — запускается, когда встречается инструкция по обработке или объявление XML
  • error — срабатывает при возникновении ошибки
  • finish – срабатывает по завершении потока

Здесь используется тот же XML-файл, что и раньше, за исключением того, что на этот раз данные считываются потоками. Для разбора этого XML используются следующие события: opentag , closetag , text и finish .

XML означает расширяемый язык разметки. Это простой текстовый формат, предназначенный для хранения и передачи данных.

Использование синтаксического анализа XML в NodeJS

Синтаксический анализ XML – это процесс чтения и изменения данных XML, позволяющий клиентским приложениям эффективно работать с данными.

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

Синтаксические анализаторы выполняют эту проверку, проверяя и подтверждая, что компоненты XML-документа соответствуют определению типа документа (DTD) или шаблону схемы.

Одной из часто используемых и простых библиотек, которые мы можем использовать для анализа XML, является xml2js . Это простой двунаправленный преобразователь объектов XML в javascript, использующий sax-js и xmlbuilder-js .

Самый быстрый и простой способ установить xml2js и все его зависимости — использовать менеджер пакетов узла (npm) с помощью приведенной ниже команды.

Сначала мы создадим каркас сервера приложений node с файлом index.js для написания нашего кода.

Поскольку мы установили xml2js как отдельный модуль, мы воспользуемся функцией require(), чтобы включить его в основной файл index.js и сделать его одной из зависимостей, перечисленных в файле package.json.

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

Однако это может быть не идеальный метод анализа XML для больших файлов, если мы пишем стандартный производственный код. Мы можем использовать fs.readFileSync() для синхронного чтения XML-файла перед его синтаксическим анализом с помощью модуля fs.

fs.readFileSync() — это встроенный API для модуля fs, который синхронно возвращает содержимое файла. Когда у нас есть файл, мы можем использовать анализируемый объект для анализа файла, как показано ниже.

Использование анализируемого объекта для анализа файла

Мы также можем прочитать файл асинхронно, а затем проанализировать его, как показано в приведенном ниже коде.

Как показано ниже, ответ этой конечной точки будет передан объекту Parse xml2js для анализа.

Статьи DelftStack написаны такими же фанатами программного обеспечения, как и вы. Если вы также хотите внести свой вклад в DelftStack, написав платные статьи, вы можете посетить страницу «Написать для нас».


сообщить об этом объявлении

Читайте также: