Adds XML parsing to the body-parser library, so you can convert incoming XML data into a JSON representation.
This is really useful if you want to deal with plain old JavaScript objects, but you need to interface with XML APIs.
npm install express body-parser body-parser-xml
This library adds an xml
method to the body-parser
object.
Initialise like so:
const bodyParser = require('body-parser');
require('body-parser-xml')(bodyParser);
Once initialised, you can use it just like any other body-parser
middleware:
const app = require('express')();
app.use(bodyParser.xml());
This will parse any XML-based request and place it as a JavaScript object on req.body
for your route handlers to use.
An XML-based request is determined by the value of the Content-Type
header. By default, any Content-Type
header ending in /xml
or +xml
will be parsed as XML. For example, the following Content-Types will all match:
text/xml
application/xml
application/rss+xml
If you need to match against a custom Content-Type
header, pass in the type
to match as an option (see below).
You can also pass in options:
app.use(bodyParser.xml(options));
The options
object accepts any of the following keys:
Specify the default character set for the text content if the charset is not specified in the Content-Type
header of the request. Defaults to utf-8
.
When set to true
, then deflated (compressed) bodies will be inflated; when false
, deflated bodies are rejected. Defaults to true
.
Controls the maximum request body size. If this is a number, then the value specifies the number of bytes; if it is a string, the value is passed to the bytes library for parsing. Defaults to '100kb'
.
The type option is used to determine what media type the middleware will parse. This option can be a string, array of strings, or a function. If not a function, type option is passed directly to the type-is library and this can be an extension name (like xml), a mime type (like application/xml), or a mime type with a wildcard (like / or _/xml). If a function, the type option is called as fn(req) and the request is parsed if it returns a truthy value. Defaults to ['_/xml', '+xml']
.
The verify
option, if supplied, is called as verify(req, res, buf, encoding)
, where buf
is a Buffer
of the raw request body and encoding
is the encoding of the request. The parsing can be aborted by throwing an error.
This option controls the behaviour of the XML parser. You can pass any option that is supported by the xml2js library: see here for a list of these options.
const express = require('express');
const bodyParser = require('body-parser');
require('body-parser-xml')(bodyParser);
const app = express();
app.use(
bodyParser.xml({
limit: '1MB', // Reject payload bigger than 1 MB
xmlParseOptions: {
normalize: true, // Trim whitespace inside text nodes
normalizeTags: true, // Transform tags to lowercase
explicitArray: false, // Only put nodes in array if >1
},
}),
);
app.post('/users', function (req, res, body) {
// Any request with an XML payload will be parsed
// and a JavaScript object produced on req.body
// corresponding to the request payload.
console.log(req.body);
res.status(200).end();
});
This library was born out of a frustration that express-xml-bodyparser, the most popular XML-parsing library for express, doesn't support the regular body-parser
options - in particular, limiting the payload size.
This library was written to use body-parser
's text parser under the hood, and then passes the parsed string into the XML parser. We can therefore take advantage of body-parser
's regular options, and support limiting the payload size, amongst other things.
MIT