npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@qdabra/build-xml

v0.0.5

Published

Helper library for building XML DOMs

Downloads

2

Readme

build-xml

Helper library for building XML DOMs

Example


import { DOMParser } from '@xmldom/xmldom';
import { buildXmlDom, makeElementCreator } from '@qdabra/build-xml';

const parser = new DOMParser();

// use an element creator to create elements in a given namespace
const makeCatElement = makeElementCreator('http://example.qdabra.com/catalog', 'cat');
const makeNoteElement = makeElementCreator('http://example.qdabra.com/notation', 'note');

const makeBook = (title, publishDate) => makeCatElement('Book', {
    attributes: {
        title,
        author,
        publishDate,
    },
});

const doc = buildXmlDom((doc) => 
    // root element
    makeCatElement(doc, 'Catalog', {
        children: [
            // child element
            makeCatElement(doc, 'Books', {
                children: [
                    makeBook(doc, 'The Great Gatsby', 'F. Scott Fitzgerald', '1925'),
                    makeBook(doc, 'Où es-tu', 'Marc Levy', '2001'),
                    makeBook(doc, '君の名は。', '新海誠', '1996'),
                ],
            }),
            makeNoteElement(doc, 'Comment', {
                text: 'Last updated: 2023-08-25',
            }),
        ],
        // namespace declarations
        namespaces: {
            'cat': 'http://example.qdabra.com/catalog',
            'note': 'http://example.qdabra.com/notation',
        },
    }),
    // pass any DOM compliant parser here
    // can be omitted in browsers
    { parser },
);

Result


<cat:Catalog xmlns:cat="http://example.qdabra.com/catalog" xmlns:note="http://example.qdabra.com/notation">
  <cat:Books>
    <cat:Book title="The Great Gatsby" author="F. Scott Fitzgerald" publishDate="1925"/>
    <cat:Book title="Où es-tu" author="Marc Levy" publishDate="2001"/>
    <cat:Book title="君の名は。" author="新海誠" publishDate="1996"/>
  </cat:Books>
  <note:Comment>Last updated: 2023-08-25</note:Comment>
</cat:Catalog>

Functions

buildXmlDom

buildXmlDom(
    buildRoot: (DOMDocument) -> Element | Node[],
    options?: BuildDomOptions,
) -> DOMDocument

Builds an XML DOM using the provided root creation function.

The provided function should either return a single DOMElement or an array of nodes including one DOMElement and other non-element nodes that are permitted at the root of an XML document (comments, processing instructions, etc.)

The element returned from the buildRoot function can contain further child nodes, etc., essentially representing an entire node tree, and this is the intended way to use this function.

This function will use the DOMParser provided in options to create the DOM document. If none is provided, it will attempt to create one with window.DOMParser.

Returns A DOM document containing the returned node(s)

Example:

const childNames = ['a', 'b', 'c'];

const makeChild = (dom) => (name) => createElement(
    dom,
    null,
    name,
);

/*
    <myDocument>
        <a />
        <b />
        <c />
    </myDocument>
*/
const myDocument = buildXmlDom(
    (dom) => createElement(
        dom,
        null,
        'myDocument',
        {
            children: childNames.map(makeChild(dom)),
        },
    ),
);

createElement

createElement(
    dom: DOMDocument,
    namespaceURI: string,
    qualifiedName: string,
    options? CreateElementOptions,
) -> DOMElement

Creates a single DOM element with the specified namespace and name.

For elements that are not in a namespace, specify null for the namespaceURI.

If the name includes a prefix, include the prefix in the value specified for qualifiedName.

See below for more details about CreateElementOptions.

Returns: the created element

Example:

const NS_XSL = 'http://www.w3.org/1999/XSL/Transform';

/*
    <xsl:template name="MyTemplate" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:text>Some Text</xsl:text>
    </xsl:template>
*/
const xslTemplateElement = createElement(
    dom,
    NS_XSL,
    'xsl:template',
    {
        attributes: {
            name: 'MyTemplate',
        },
        children: [
            createElement(
                dom,
                NS_XSL,
                'xsl:text',
                {
                    text: 'Some Text',
                },
            ),
        ],
    },
);

makeElementCreator

makeElementCreator(
    namespaceURI?: string,
    prefix?: string,
) -> ElementCreator

Creates a function which is similar to createElement, but which allows omitting the namespace URI and prefix. Useful when you want to create different elements in the same namespace.

You can omit both arguments to make an element creator for elements with no namespace.

Returns: an element creation function

Example

const makeXslElement = makeElementCreator(
    'http://www.w3.org/1999/XSL/Transform',
    'xsl',
);

/*
    <xsl:template name="MyTemplate" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:text>Some Text</xsl:text>
    </xsl:template>
*/
const xslTemplateElement = makeXslElement(
    dom,
    'template',
    {
        attributes: {
            name: 'MyTemplate',
        },
        children: [
            makeXslElement(
                'text',
                {
                    text: 'Some Text',
                },
            ),
        ],
    },
);

makeEmptyDom

makeEmptyDom(
    parser?: DOMParser,
) -> DOMDocument

Creates a new DOMDocument with no nodes, using the given parser.

If no parser is given, will attempt to create one with window.DOMParser.

Returns: The created DOM document

Example:

const myDom = makeEmptyDom();

makeProcessingInstruction

makeProcessingInstruction(
    dom: DOMDocument,
    name: string,
    attributes: Record<string, string>,
) -> DOMProcessingInstruction

Creates a new processing instruction with the provided pseudo-attributes.

Returns: The created processing instruction

Example:

/*
    <?Book title="Love means never having to say &quot;I&apos;m sorry&quot;" author="John Doe"?>
*/
const myPi = makeProcessingInstruction(
    dom,
    'Book',
    {
        title: `Love means never having to say "I\'m sorry"`,
        author: "John Doe",
    },
);

parseXmlString

parseXmlString(
    xmlString: string,
    parser?: DOMParser,
) -> DOMDocument

Parses the specified XML string into an XML document.

If no parser is given, will attempt to create one with window.DOMParser.

Returns: the parsed document

Example:

const myDoc = parseXmlString('<Books><Book>Lord of the Rings</Book><Book>The Prince and the Pauper</Book></Books>');

Interfaces

CreateElementOptions

{
    children?: Node[];
    attributes?: Record<string, string>;
    text?: string;
    namespaces?: Record<string, string>;
    nsAttributes?: Record<string, Record<string, string>>;
}

Passed to createElement() or to element creators created using makeElementCreator.

children - array of children to append to the created element

attributes - a set of key-value pairs for the names and values of non-namespace attributes to add to the element

text - text content to add within the element. Any child nodes specified in children will be appended after the given text.

namespaces - a set of key value pairs for namespace prefixes and namespace URIs, to be added as namespace declarations on the element

nsAttributes - key value pairs where the keys are namespace URIs, and the values are key-value collections of attribute names and values.

Example:

const NS_XSI = "http://www.w3.org/2001/XMLSchema-instance";
const NS_XSD = "http://www.w3.org/2001/XMLSchema";

{
    [NS_XSI]: {
        'xsi:schemaLocation': './myschema.xsd',
        'xsi:nil': 'true',
    },
    [NS_XSD]: {
        'xsd:type': 'xsd:string',
    },
}

BuildDomOptions

{
    parser?: DOMParser;
}

Passed to buildXmlDom to indicate a parser to use when creating the DOM.

ElementCreator

(
    dom: Document,
    localName: string,
    options?: CreateElementOptions,
) -> Element;

The signature of functions created with makeElementCreator().

This is similar to the signature of makeElement(), but does not have a namespaceURI parameter, and has a localName parameter instead of a qualifiedName parameter.