xml
Install
Note, if you're using @xmpp/client
or @xmpp/component
, you don't need to install @xmpp/xml
yourself.
npm install @xmpp/xml
or yarn add @xmpp/xml
const xml = require('@xmpp/xml')
const {xml} = require('@xmpp/client')
const {xml} = require('@xmpp/component')
Writing
There's 2 methods for writing XML with xmpp.js
factory
const xml = require('@xmpp/xml')
const recipient = 'user@example.com'
const days = ['Monday', 'Tuesday', 'Wednesday']
const message = xml(
'message',
{to: recipient},
xml('body', {}, 1 + 2),
xml('days', {}, days.map((day, idx) => xml('day', {idx}, day)))
)
If the second argument passed to xml
is a string
instead of an object
, it will be set as the xmlns
attribute.
xml('time', 'urn:xmpp:time')
xml('time', {xmlns: 'urn:xmpp:time'})
JSX
const xml = require('@xmpp/xml')
const recipient = 'user@example.com'
const days = ['Monday', 'Tuesday']
const message = (
<message to={recipient}>
<body>{1 + 2}</body>
<days>
{days.map((day, idx) => (
<day idx={idx}>${day}</day>
))}
</days>
</message>
)
Requires a preprocessor such as Babel with @babel/plugin-transform-react-jsx.
Reading
attributes
The attrs
property is an object that holds xml attributes of the element.
message.attrs.to
text
Returns the text value of an element
message.getChild('body').text()
getChild
Get child element by name.
message.getChild('body').toString()
getChildText
Get child element text value.
message.getChildText('body')
getChildren
Get children elements by name.
message.getChild('days').getChildren('day')
Since getChildren
returns an array, you can use JavaScript array methods such as filter and find to build more complex queries.
const days = message.getChild('days').getChildren('day')
days.find(day => day.text() === 'Monday')
days.find(day => day.attrs.idx === 0)
days.filter(day => day.attrs.idx > 2)
parent
You can get the parent node using the parent property.
console.log(message.getChild('days').parent === message)
root
You can get the root node using the root method.
console.log(message.getChild('days').root() === message)
Editing
attributes
The attrs
property is an object that holds xml attributes of the element.
message.attrs.type = 'chat'
Object.assign(message.attrs, {type: 'chat'})
text
Set the text value of an element
message.getChild('body').text('Hello world')
append
Adds text or element nodes to the last position.
Returns the parent.
message.append(xml('foo'))
message.append('bar')
message.append(days.map(day => xml('day', {}, day)))
prepend
Adds text or element nodes to the first position.
Returns the parent.
message.prepend(xml('foo'))
message.prepend('bar')
message.prepend(days.map(day => xml('day', {}, day)))
remove
Removes a child element.
const body = message.getChild('body')
message.remove(body)
JSON
You can embed JSON anywhere but it is recommended to use an appropriate semantic.
message.append(
<myevent xmlns="xmpp:example.org">
<json xmlns="urn:xmpp:json:0">{JSON.stringify(days)}</json>
</myevent>
)
JSON.parse(
message
.getChild('myevent', 'xmpp:example.org')
.getChildText('json', 'urn:xmpp:json:0')
)
See JSON Containers