xml2js получает obj корневого узла, если имя неизвестно (варьируется)

Я использую xml2js для анализа xml в моем проекте Aguilar CLI 9 и задаюсь вопросом, как получить obj корневого узла, если имя неизвестно (меняется) по запросу. Например, следующий синтаксис запроса работает для получения значения obj и атрибута корневого узла:

result.Home.$.Name;

Однако по запросу не буду, если root будет Home, Foo и т.д. Пробовал следующее, но не получилось:

result[0].$.Name;

result.root.$.Name;

Кроме того, я очень новичок в Angular и Typescript, может ли кто-нибудь указать мне хорошую документацию о том, какой синтаксис запроса используется? Не уверен, что это xml2js, typescript или js. Я использую xpath для запроса, так что это сильно отличается.

Заранее спасибо!


person OtoNoOto    schedule 15.05.2020    source источник


Ответы (1)


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

Сначала мы получим собственные ключи свойств результирующего объекта. Самый простой способ сделать это — использовать Object.keys:

const result = await xml2js.parseStringPromise(someXML);

const keys = Object.keys(result);

Теперь это приводит к массиву ключей свойств, но, поскольку объект имеет только один, мы можем просто использовать первый ключ

const [rootKey] = Object.keys(result);

Теперь мы будем использовать этот rootKey для доступа к объекту, представляющему корневой элемент, независимо от имени его тега.

result[rootKey];

Собираем вместе:

import xml2js from 'xml2js';

async function processXML() {
  const result = await xml2js.parseStringPromise(someXML);

  const [rootKey] = Object.keys(result);

  const attributes = result[rootKey].$;
}
person Aluan Haddad    schedule 15.05.2020
comment
Hadded Спасибо за подробное объяснение. Использование Object.keys работает для моего варианта использования! - person OtoNoOto; 15.05.2020