Пакет NPM xml-flow - Неожиданное поведение при разборе XML - PullRequest
0 голосов
/ 01 сентября 2018

Фон

Я использую пакет 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 Ответ

0 голосов
/ 02 сентября 2018

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

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

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

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

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

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

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

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

...