Как анализировать содержимое элемента xml, включая теги элемента

avatar
Jordi Tieman
1 июля 2021 в 15:47
36
1
0

В файле XML я пытаюсь проанализировать содержимое элемента, включая теги других элементов, а не только текст. Сначала я пытался сделать это с помощью регулярных выражений, но где-то читал, что это невозможно или очень сложно. Позже я попытался использовать DOMParser, но не смог сделать это правильно. XML-файл выглядит примерно так:

.
<element1>
  <element2>
    ABC
  </element2>
  <element3>
    DEF
  </element3>
</element1>

Мой желаемый результат:

  <element2>
    ABC
  </element2>
  <element3>
    DEF
  </element3>

Я пытаюсь сделать это в Javascript, и теперь мой код выглядит так:

f = file.xml;
const content = fs.ReadFileSync(f, 'utf-8');
parser = new DOMParser();
xmlDoc= new parser().parseFromString(content, "text/xml");
result = xmlDoc.getElementsByTagName("element1")[0].childNodes[0].nodeValue;
return result;

Я знаю, что это вернет текст только в element1, а его там нет, но я не знаю, каким будет правильный код.

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

Источник

Ответы (1)

avatar
Martin Honnen
1 июля 2021 в 18:32
0

Если вы одновременно хотите проанализировать XML и сериализовать некоторые узлы обратно в строку, вы можете использовать Saxon-JS и XPath 3.1 в наши дни как на клиентской платформе JavaScript, так и на Node.js:

var SaxonJS = require("saxon-js")

const content = `<element1>
  <element2>
    ABC
  </element2>
  <element3>
    DEF
  </element3>
</element1>`;

const xmlDoc = SaxonJS.XPath.evaluate('parse-xml($content)', [], { params : { content : content } });

var result = SaxonJS.XPath.evaluate('serialize(/element1/node())', xmlDoc);

console.log(result);

    const content = `<element1>
      <element2>
        ABC
      </element2>
      <element3>
        DEF
      </element3>
    </element1>`;
    
    const xmlDoc = SaxonJS.XPath.evaluate('parse-xml($content)', [], { params : { content : content } });
    
    var result = SaxonJS.XPath.evaluate('serialize(/element1/node())', xmlDoc);
    
    console.log(result);
<script src="https://www.saxonica.com/saxon-js/documentation/SaxonJS/SaxonJS2.rt.js"></script>