XMLBuilder добавляет атрибуты к неправильному узлу в файле XML

#javascript #node.js #xml-builder

#javascript #node.js #xml-builder

Вопрос:

Я создаю XML-файлы при Node.js использовании XMLBuilder пакета. Все работает нормально, за исключением одной вещи. Я пытаюсь добавить атрибуты к root элементу, но по какой-то причине он добавляется к child элементу.

Я объявил свой root элемент следующим образом:

 //Create the header for XML
var builder     =   require('xmlbuilder');

var root        =   builder.create('test:XMLDocument')
                            root.att('schemaVersion', "2.0")
                            root.att('creationDate', '2020-10-09T09:53:00.000 02:00')
                            root.att('xmlns:xsi', "http://www.w3.org/2001/XMLSchema-instance")
root            =   root.ele('MyBody')
root            =   root.ele('MyEvents')
  

После объявления, когда я пытаюсь добавить еще несколько атрибутов к своим корневым элементам:

 root.att('new1','additionalAttributes1')
root.att('new2','additionalAttributes2')
  

Он добавляется к MyEvents и выглядит примерно так:

 <?xml version="1.0"?>
<test:XMLDocument schemaVersion="2.0" creationDate="2020-10-09T09:53:00.000 02:00">
    <MyBody>
        <MyEvents new1="additionalAttributes1" new2="additionalAttributes2">
        </MyEvents>
    </MyBody>
</test:XMLDocument>
  

Но я ожидаю, что сгенерированный XML-файл будет выглядеть примерно так:

 <?xml version="1.0"?>
<test:XMLDocument schemaVersion="2.0" creationDate="2020-10-09T09:53:00.000 02:00" new1="additionalAttributes1" new2="additionalAttributes2">
    <MyBody>
        <MyEvents>
        </MyEvents>
    </MyBody>
</test:XMLDocument>
  

Я знаю, что если я объявлю свой XML-элемент таким образом, я смогу достичь ожидаемого результата, но поскольку я передаю его другой функции, я не могу объявить его так:

 //Create the header for XML
var builder             =   require('xmlbuilder');

var root        =   builder.create('test:XMLDocument')
                            root.att('schemaVersion', "2.0")
                            root.att('creationDate', '2020-10-09T09:53:00.000 02:00')
                            root.att('xmlns:xsi', "http://www.w3.org/2001/XMLSchema-instance")
                            
root.att('new1','additionalAttributes1')
root.att('new2','additionalAttributes2')

root            =   root.ele('MyBody')
root            =   root.ele('MyEvents')
  

Я попытался добавить .up(), чтобы посмотреть, добавляется ли он к родительскому, но безуспешно. Может кто-нибудь, пожалуйста, помогите мне, как я могу добавить атрибуты к родительскому, когда у меня есть несколько дочерних элементов, и достичь требуемых результатов?

Ответ №1:

вам просто нужно подняться дважды

 var builder = require('xmlbuilder')
var root = builder.create('test:XMLDocument')
root.att('schemaVersion', '2.0')
root.att('creationDate', '2020-10-09T09:53:00.000 02:00')
root.att('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance')
root = root.ele('MyBody')
root = root.ele('MyEvents')

root = root.up().up()
root.att('new1','additionalAttributes1')
root.att('new2','additionalAttributes2')

console.log(root.end({pretty: true}));
  

вывод

 <?xml version="1.0"?>
<test:XMLDocument schemaVersion="2.0" creationDate="2020-10-09T09:53:00.000 02:00" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" new1="additionalAttributes1" new2="additionalAttributes2">
  <MyBody>
    <MyEvents/>
  </MyBody>
</test:XMLDocument>
  

Комментарии:

1. Большое спасибо за ответ. Это работает так, как ожидалось.