Skip to content

prettydiff/js-xml-builder

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

xml-builder

Build XML dynamically.

Some rant

Looking through the NPM trying to find an intuitive way to declare XML using JSON objects and all I see is a $#1tload of bad syntax design. Why is it so hard to first design the syntax and then the desired functionality around it? The developers are the users, one should know to program for their convenience.

So here's another attempt at an XML builder...

How easy this is

Write this

const XMLObject = require('xml-builder');

var xml = new XMLObject('html');

// assign an attribute
xml._lang = 'en';
// assign a whole object
xml.head = {
    meta: {
        _charset: 'utf-8'
    }
}
// go deeper
xml.head.title = 'example'
// or more complex
xml.body = {
    div: {
        _class: 'my-design',
        p: [
            'hello', 'how', 'are', 'you'
        ],
        br: null
    }
}
// or even do this
xml.body.div.div.p = 'great'

and with

xml.toXML();

get that:

<html lang="en">
	<head>
		<meta charset="utf-8"/>
		<title>example</title>
	</head>
	<body>
		<div class="my-design">
			<p>hello</p>
			<p>how</p>
			<p>are</p>
			<p>you</p>
			<br/>
			<div>
				<p>great</p>
			</div>
		</div>
	</body>
</html>

or with

xml.toXML({
    indent: 2, newLine: '\n'
})

this:

<html lang="en">
  <head>
    <meta charset="utf-8"/>
    <title>example</title>
  </head>
  <body>
    <div class="my-design">
      <p>hello</p>
      <p>how</p>
      <p>are</p>
      <p>you</p>
      <br/>
      <div>
        <p>great</p>
      </div>
    </div>
  </body>
</html>

Every element in the object tree (except for assigned primitive values) is an XMLObject. Therefore the same functionality applies to those objects:

xml.head.toXML()
<head>
    <meta charset="utf-8"/>
    <title>example</title>
</head>
xml.head.toObject()
{ head: { meta: { _charset: 'utf-8' }, title: 'example' } }

PS. The examples include a lot of HTML, this library is not intended for composing HTML.

Requirements

Since this is based on ES6 proxies, then ES6 support is required:

Constructor overloads

new XMLObject('html')
new XMLObject('html', {head: {}, body: {}})
new XMLObject('html', {head: {}, body: {}}, ...options)
new XMLObject({html: {head: {}, body: {}}})
new XMLObject({html: {head: {}, body: {}}}, ...options)

Options

Different options can be passed to the constructor or toXML(options) method

Name Default Usage Description
attrSel "_" constructor used to identify attributes (attrSel + attributeName, i.e. "_charset")
defVal "" constructor default value to use when element value has not been provided
indent "\t" toXML indent definition, can be any string
newLine "\r\n" toXML newline definition, can be any string
attrKey null toXML when provided, will group the attributes of an element under attrKey object
declaration null toXML provide true for the default declaration, or any string to override it

Testing

node test

Licence

MIT

About

build XML dynamically

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 100.0%