@xmpp-infister/xml
v0.9.3
Published
XMPP XML for JavaScript
Downloads
7
Maintainers
Readme
xml
Install
Note, if you're using @xmpp-infister/client
or @xmpp-infister/component
, you don't need to install @xmpp-infister/xml
yourself.
npm install @xmpp-infister/xml
or yarn add @xmpp-infister/xml
const xml = require('@xmpp-infister/xml')
const {xml} = require('@xmpp-infister/client')
const {xml} = require('@xmpp-infister/component')
Writing
There's 2 methods for writing XML with xmpp.js
factory
const xml = require('@xmpp-infister/xml')
const recipient = '[email protected]'
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.
// both are equivalent
xml('time', 'urn:xmpp:time')
xml('time', {xmlns: 'urn:xmpp:time'})
JSX
/** @jsx xml */
const xml = require('@xmpp-infister/xml')
const recipient = '[email protected]'
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 // [email protected]
text
Returns the text value of an element
message.getChild('body').text() // '3'
getChild
Get child element by name.
message.getChild('body').toString() // '<body>3</body>'
getChildText
Get child element text value.
message.getChildText('body') // '3'
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')
// Find Monday element
days.find(day => day.text() === 'Monday')
days.find(day => day.attrs.idx === 0)
// Find all days after Tuesday
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)))
// <message>
// ...
// <foo/>
// bar
// <day>Monday</day>
// <day>Tuesday</day>
// </message>
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)))
// <message>
// <day>Tuesday</day>
// <day>Monday</day>
// bar
// <foo/>
// ...
// </message>
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.
/** @jsx xml */
// write
message.append(
<myevent xmlns="xmpp:example.org">
<json xmlns="urn:xmpp:json:0">{JSON.stringify(days)}</json>
</myevent>
)
// read
JSON.parse(
message
.getChild('myevent', 'xmpp:example.org')
.getChildText('json', 'urn:xmpp:json:0')
)
See JSON Containers