XML Serialization and Parsing module based on Python's ElementTree.
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Support for XML comments, CDATA sections, and processing instructions.
Create XML comment elements for documentation and markup.
/**
* Create XML comment element
* @param {string} text - Comment text content
* @returns {Element} Element representing XML comment
*/
function Comment(text);Usage Examples:
const et = require('elementtree');
// Create comment
const comment = et.Comment('This is a comment');
// Add to document
const root = et.Element('root');
root.append(comment);
const xml = et.tostring(root, {xml_declaration: false});
console.log(xml);
// Output: <root><!--This is a comment--></root>
// Comment with complex text
const detailedComment = et.Comment('TODO: Add validation here');
const container = et.Element('form');
container.append(detailedComment);
const formXml = et.tostring(container, {xml_declaration: false, indent: 2});
console.log(formXml);
/* Output:
<form>
<!--TODO: Add validation here-->
</form>
*/Create CDATA sections for including literal text that may contain XML markup.
/**
* Create CDATA section element
* @param {string} text - CDATA text content
* @returns {Element} Element representing CDATA section
*/
function CData(text);Usage Examples:
const et = require('elementtree');
// Create CDATA section
const script = et.CData('if (x < 10 && y > 5) { alert("Hello <world>!"); }');
// Add to document
const html = et.Element('script');
html.set('type', 'text/javascript');
html.append(script);
const xml = et.tostring(html, {xml_declaration: false});
console.log(xml);
// Output: <script type="text/javascript"><![CDATA[if (x < 10 && y > 5) { alert("Hello <world>!"); }]]></script>
// CDATA with XML content
const xmlContent = et.CData('<root><item>data</item></root>');
const example = et.Element('example');
example.append(xmlContent);
const exampleXml = et.tostring(example, {xml_declaration: false});
console.log(exampleXml);
// Output: <example><![CDATA[<root><item>data</item></root>]]></example>Create XML processing instructions for application-specific metadata.
/**
* Create processing instruction element
* @param {string} target - PI target name
* @param {string} text - Optional PI text content
* @returns {Element} Element representing processing instruction
*/
function ProcessingInstruction(target, text);
// Alias for ProcessingInstruction
const PI = ProcessingInstruction;Usage Examples:
const et = require('elementtree');
// Create processing instruction
const stylesheet = et.ProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="style.xsl"');
// Add to document
const root = et.Element('document');
root.append(stylesheet);
const xml = et.tostring(root, {xml_declaration: false});
console.log(xml);
// Output: <document><?xml-stylesheet type="text/xsl" href="style.xsl"?></document>
// Using PI alias (shorthand)
const stylesheetPI = et.PI('xml-stylesheet', 'type="text/css" href="main.css"');
// PI with just target
const simplePI = et.ProcessingInstruction('target-only');
const container = et.Element('container');
container.append(simplePI);
const containerXml = et.tostring(container, {xml_declaration: false});
console.log(containerXml);
// Output: <container><?target-only?></container>ElementTree provides convenient aliases for processing instructions.
// PI is an alias for ProcessingInstruction
const PI = et.PI;
// Same as et.ProcessingInstruction
const pi = PI('target', 'content');Usage Examples:
const et = require('elementtree');
// Using PI alias
const instruction = et.PI('php', 'echo "Hello World";');
const doc = et.Element('document');
doc.append(instruction);
const xml = et.tostring(doc, {xml_declaration: false});
console.log(xml);
// Output: <document><?php echo "Hello World";?></document>Combine special elements with regular content for complex document structures.
Usage Examples:
const et = require('elementtree');
// Create complex document with mixed special elements
const html = et.Element('html');
// Add processing instruction
const stylesheet = et.PI('xml-stylesheet', 'type="text/css" href="styles.css"');
html.append(stylesheet);
// Add comment
const comment = et.Comment('Generated by ElementTree');
html.append(comment);
// Add regular content
const head = et.SubElement(html, 'head');
const title = et.SubElement(head, 'title');
title.text = 'Test Page';
const body = et.SubElement(html, 'body');
// Add script with CDATA
const script = et.SubElement(body, 'script');
script.set('type', 'text/javascript');
const scriptContent = et.CData(`
function init() {
console.log("Page loaded <script>");
if (x < 10) { alert("Low value"); }
}
`);
script.append(scriptContent);
// Serialize with pretty printing
const xml = et.tostring(html, {xml_declaration: false, indent: 2});
console.log(xml);
/* Output:
<html>
<?xml-stylesheet type="text/css" href="styles.css"?>
<!--Generated by ElementTree-->
<head>
<title>Test Page</title>
</head>
<body>
<script type="text/javascript">
<![CDATA[
function init() {
console.log("Page loaded <script>");
if (x < 10) { alert("Low value"); }
}
]]>
</script>
</body>
</html>
*/Special elements are still Element instances with standard properties.
Usage Examples:
const et = require('elementtree');
// Create special elements
const comment = et.Comment('This is a comment');
const cdata = et.CData('Raw data <content>');
const pi = et.PI('target', 'instruction content');
// Check element properties
console.log(comment.tag); // [Function: Comment]
console.log(comment.text); // "This is a comment"
console.log(cdata.tag); // [Function: CData]
console.log(cdata.text); // "Raw data <content>"
console.log(pi.tag); // [Function: ProcessingInstruction]
console.log(pi.text); // "target instruction content"
// Special elements can have attributes (though rarely used)
comment.set('author', 'system');
console.log(comment.get('author')); // "system"Create special elements without content.
Usage Examples:
const et = require('elementtree');
// Empty comment
const emptyComment = et.Comment();
console.log(emptyComment.text); // null
// Empty CDATA
const emptyCData = et.CData();
console.log(emptyCData.text); // null
// Empty PI (target only)
const emptyPI = et.PI('target');
console.log(emptyPI.text); // "target"
// Serialize empty special elements
const root = et.Element('root');
root.append(emptyComment);
root.append(emptyCData);
root.append(emptyPI);
const xml = et.tostring(root, {xml_declaration: false});
console.log(xml);
// Output: <root><!----><![CDATA[]]><?target?></root>Special elements are preserved when parsing XML documents.
Usage Examples:
const et = require('elementtree');
const xmlWithSpecial = `
<?xml version="1.0"?>
<document>
<!-- This is a comment -->
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<script><![CDATA[if (x < 10) alert("test");]]></script>
</document>
`;
const etree = et.parse(xmlWithSpecial);
// Find elements (special elements may not be preserved in all cases)
// Note: Comment and PI handling may vary depending on parser configuration
const script = etree.find('script');
console.log(script.text); // May contain CDATA content
// Reserialize
const output = etree.write({xml_declaration: false, indent: 2});
console.log(output);Install with Tessl CLI
npx tessl i tessl/npm-elementtree