Удаление узла из NodeList XML Doc - PullRequest
1 голос
/ 13 апреля 2019

Я пытаюсь удалить некоторые узлы из документа XML, если они существуют в массиве ниже:

 const removeNodesDataMap = [
    'Source',
    'ProductCode',
    'ProductCategory',
    'PublicationDateTime',
    'ArticleID',
    'Author'
 ];

Я попытался сделать это с помощью пакета xmldom npm и метода removeChild следующим образом:

function removeXmlNodes(str) {
    const xmlValue = new DomParser().parseFromString(str, 'text/xml');
    removeNodesDataMap.forEach(node => {
        const rNode = xmlValue.getElementsByTagName(node)[0];
        if (rNode) {
            const sNode = xmlValue.removeChild(rNode.parentNode);
        }
    });
    const serializer = XMLSerializer.serializeToString(xmlValue);
    return serializer;
}

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

Пример XML:

<Source>ABC</Source>
<ProductCode>77</ProductCode>
<ProductCategory>Performance</ProductCategory>
<PublicationDateTime>2019-03-06  17:04:5.000</PublicationDateTime>
<ArticleID>123254</ArticleID>
<Author/>
<records>
<record>some record stuff that I actually want to return along with node</record>
</records>

Ожидаемый результат:

"<records><record>some record stuff that I actually want to return along with node</record></records>"

Может кто-нибудь, пожалуйста, помогите?

1 Ответ

0 голосов
/ 13 апреля 2019

это кажется немного странным с вашим xml, когда отсутствует рут.Я вроде как могу исправить вашу проблему, но мне нужно содержимое XML, завернутый в корень.Основное изменение удаляется путем вызова node.ParentNode.remove (node)

const { DOMParser, XMLSerializer } = require('xmldom');

const removeNodesDataMap = [
  'Source',
  'ProductCode',
  'ProductCategory',
  'PublicationDateTime',
  'ArticleID',
  'Author',
];

function removeXmlNodes(str) {
  const xmlValue = new DOMParser().parseFromString(`<root id="root">${str}</root>`, 'text/xml');
  removeNodesDataMap.forEach(node => {
    const rNode = xmlValue.getElementsByTagName(node)[0];
    if (rNode) {
      rNode.parentNode.removeChild(rNode);
    }
  });
  const serializer = new     XMLSerializer().serializeToString(xmlValue.getElementById('root'));
  return serializer;
}

const input = `
<Source>ABC</Source>
<ProductCode>77</ProductCode>
<ProductCategory>Performance</ProductCategory>
<PublicationDateTime>2019-03-06  17:04:5.000</PublicationDateTime>
<ArticleID>123254</ArticleID>
<Author/>
<records>
<record>some record stuff that I actually want to return along with node</record>
</records>
`;

console.log(removeXmlNodes(input))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...