Пакет NPM xml-flow - Неожиданное поведение при разборе XML

Фон

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

Мое намерение состоит в том, чтобы проанализировать огромный XML -файл, используя повторяющийся узел XML. Файл XML может быть любым URL, и повторяющийся узел будет предоставлен из пользовательского интерфейса.

Я пытался использовать параметры со всеми возможными значениями, но поведение при разборе, похоже, не изменилось.

Образец кода

Я использовал следующий пример XML -

<list>
    <item>
        <details>
            <id>1</id>
        </details>
    </item>
    <item>
        <details>
            <id>2</id>
            <description>description for item 2</description>
        </details>
    </item>
</list>

Я попытался разобрать его с помощью item как повторяющийся узел следующим образом -

const fs = require("fs");
const flow = require("xml-flow");

const xmlStream = flow(fs.createReadStream("./sample.xml"));

xmlStream.on('tag:item', function (person) {
    console.log(JSON.stringify(person, null, 4));
});

Я получил следующий ответ для 2 проанализированных узлов XML -

// node 1
{
    "$name": "item",
    "details": "1"
}

// node 2
{
    "$name": "item",
    "details": {        
        "id": "2",
        "description": "description for item 2"
    }
}

проблема

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

В случае первого узла XML, <id> узел не появился в объекте JSON (в отличие от второго узла XML), потому что его родительский узел, а именно. <details> имеет только один дочерний узел, а именно. <id>,

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

Например, если в xml-файле содержится 10000 записей, а все записи после 5000-й записи имеют структуру узла 2, item.details Относительный путь будет указывать на строку для записей от 1 до 5000, тогда как этот же путь будет указывать на объект для оставшихся записей.

Альтернативный пакет NPM

Я пытался использовать xml-stream которая работает по той же логике, но имеет проблему сбора подэлементов, объясненных здесь, что является еще более сложной проблемой для меня, так как структура входящего XML в этом случае будет варьироваться от файла к файлу.

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

Ура!

1 ответ

Что ж! После выполнения этих пакетов кажется, что нет решения этой проблемы (я мог что-то упустить), если не предоставлена ​​явная поддержка.

В конце концов я решил написать новую логику и в итоге написал новый пакет npm xtreamer, который предоставляет узлы xml вместо их преобразования в объекты JSON.

Этот пакет предоставляет transform stream которые могут быть переданы любым readable stream, Он ожидает имя узла xml в запросе и генерирует пользовательское событие xmldata вывести узел XML.

Выход может быть подключен к любому xml-json npm package согласно требованию, чтобы получить окончательный JSON. Проверьте пакет npm для получения дополнительной информации.

поддерживающий модуль

Мне удалось создать еще один пакет xtagger npm, который использует sax npm package и обеспечивает структуру XML в следующем формате -

structure: { [name: string]: { [hierarchy: number]: number } };

Этот пакет можно использовать для поиска повторяющихся узлов в файле XML с учетом их иерархии.

Другие вопросы по тегам