Ошибка синтаксического анализа xml при наличии директив пространства имен

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

Я использую ...

var fs = require('fs');
var xpath = require('xpath');
var dom   = require('xmldom').DOMParser;

var xml = fs.readFileSync('/test.xml', 'utf8').toString();
var doc = new dom().parseFromString(xml);
var id = xpath.select("/export/asset/id", doc);

console.log(id[0].firstChild.data);

XML-файл

<export xmlns="some url" xmlns:xsi="some url" format="archive" version="2.4" xsi:schemaLocation="some url.xsd">
  <asset>
    <id>1445254514291</id>
    <name>test</name>
    <displayName />
    <origin>demo</origin>
  </asset>
<export>

person user10053673    schedule 07.09.2020    source источник
comment
Вместо того, чтобы пытаться обойти или игнорировать их, вам серьезно нужно научиться уважать пространства имен XML и включать их в свои запросы!   -  person marc_s    schedule 07.09.2020


Ответы (1)


Вообще говоря, предпочтительнее учитывать пространства имен, но если вам приходится иметь дело со слишком многими из них, один из способов вообще их избежать — использовать xpath и несколько запутанную, но эффективную функцию local-name().

Так что я бы изменил

var id = xpath.select("/export/asset/id", doc);

to

var id = xpath.select("//*[local-name()='export']//*[local-name()='asset']//*[local-name()='id']", doc);

С образцом xml в вопросе это должно вывести:

"1445254514291"
person Jack Fleeting    schedule 08.09.2020