FILTERXML function
The FILTERXML
function in Jspreadsheet Formulas Pro is a handy tool that allows you to extract specific data from XML content. This is done by using an XPath string, which is a query language for selecting nodes from an XML document. Essentially, this function enables you to sift through and filter XML data, pinpointing and returning only the specific information you need. This can be incredibly useful for managing and organizing large sets of XML data in Jspreadsheet.
Documentation
Returns specific data from XML content by using an XPath string.
Category
Web
Syntax
FILTERXML(xml, xpath)
Parameter | Description |
---|---|
xml |
A string containing the XML content to filter. |
xpath |
A string containing the XPath expression used to extract the data. |
Behavior
The FILTERXML
function takes a string of XML and an XPath, and returns the text from the matching XML nodes. Here's how it handles various types of inputs:
- Empty Cells:
FILTERXML
function will return an error if the XML string or XPath string is empty or missing. - Text: The function expects a valid XML string and an XPath as text inputs. If the input is not valid XML or XPath, it returns an error.
- Booleans: This function does not directly handle boolean values. However, booleans can be returned as text if they are part of the XML content.
- Errors: If the XML or XPath strings are invalid, or if the XPath does not match any nodes in the XML, the function will return an error.
- Numbers: Numbers can be returned as text if they are part of the XML content. However, the function will not directly handle numbers as input.
- Arrays:
FILTERXML
function can return multiple matching nodes as an array.
Common Errors
Error | Description |
---|---|
#VALUE! | Returned when either the XML or XPath is invalid, or when the XPath does not match any nodes in the XML string. |
#N/A | Returned when the function is used in an array formula and there are not enough matching nodes to fill all the cells of the array. |
Best practices
- Always ensure that your XML and XPath strings are valid to avoid #VALUE! errors.
- Use
FILTERXML
to parse XML data, but avoid using it to validate XML data as it does not provide detailed error messages for invalid XML.- Be aware that
FILTERXML
returns an array when multiple nodes match the XPath. Make sure your formula is in an array-enabled context if you expect multiple matches.- To avoid #N/A errors in array formulas, you can wrap the
FILTERXML
function with theIFERROR
function to handle cases where there are not enough matching nodes.
Usage
A few examples using the FILTERXML function.
FILTERXML("<xml><employee><name>John Doe</name><title>Manager</title></employee></xml>", "//name")
→ Returns: "John Doe" (Extracts the <name> element text)
FILTERXML("<catalog><book genre='novel' ISBN='1-861003-74-9'><title>The Handmaid's Tale</title><price>19.95</price></book><book genre='novel' ISBN='0-553-21311-3'><title>The Hobbit</title><price>10.99</price></book></catalog>", "sum(/catalog/book/price)")
→ Returns: "30.94" (Sums the price values of all <book> elements)
Interactive Spreadsheet Demo
<html>
<script src="https://jspreadsheet.com/v11/jspreadsheet.js"></script>
<script src="https://jsuites.net/v5/jsuites.js"></script>
<link rel="stylesheet" href="https://jsuites.net/v5/jsuites.css" type="text/css" />
<link rel="stylesheet" href="https://jspreadsheet.com/v11/jspreadsheet.css" type="text/css" />
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Material+Icons" />
<script src="https://cdn.jsdelivr.net/npm/@jspreadsheet/formula-pro/dist/index.min.js"></script>
<div id="spreadsheet"></div>
<script>
// Set your JSS license key (The following key only works for one day)
jspreadsheet.setLicense('OGUyNGE1MzQ0ZDI1OTdjMDY0OTE2OGVmYzk4ZjhkNzNhMGZlY2Y3ZTNhZjdlYTJmYjUxNTE4YTZkNjZmOGQ3M2Q2YjU5ZjhjOGQyZTc1OTRjOTdmNDlmY2Y4ZDBlYTk0YTM3YTlhYmNlNjI2M2FmMGIyNDM5MjM3OGJlNWU1ZmMsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpVMk56a3pNRGMyTENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0p6ZEdGamEySnNhWFI2TG1sdklpd2lkMlZpWTI5dWRHRnBibVZ5TG1sdklpd2lkMlZpSWl3aWJHOWpZV3hvYjNOMElsMHNJbkJzWVc0aU9pSXpOQ0lzSW5OamIzQmxJanBiSW5ZM0lpd2lkamdpTENKMk9TSXNJbll4TUNJc0luWXhNU0lzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owWlhJaUxDSmlZWElpTENKMllXeHBaR0YwYVc5dWN5SXNJbk5sWVhKamFDSXNJbkJ5YVc1MElpd2ljMmhsWlhSeklpd2lZMnhwWlc1MElpd2ljMlZ5ZG1WeUlpd2ljMmhoY0dWeklpd2labTl5YldGMElsMHNJbVJsYlc4aU9uUnlkV1Y5');
// Set the extensions
jspreadsheet.setExtensions({ formula });
// Create a new spreadsheet
jspreadsheet(document.getElementById('spreadsheet'), {
worksheets: [{
data: [
[
"XML Data",
"XPath Query",
"Result"
],
[
"<employees><employee><name>Alice Smith</name><department>Sales</department><salary>65000</salary></employee><employee><name>Bob Johnson</name><department>IT</department><salary>75000</salary></employee></employees>",
"//name",
"=FILTERXML(A2,B2)"
],
[
"<products><item id='1'><name>Laptop</name><price>899.99</price></item><item id='2'><name>Mouse</name><price>25.50</price></item><item id='3'><name>Keyboard</name><price>75.00</price></item></products>",
"sum(//price)",
"=FILTERXML(A3,B3)"
],
[
"<orders><order><customer>John Doe</customer><total>150.75</total></order><order><customer>Jane Smith</customer><total>89.50</total></order></orders>",
"//customer[1]",
"=FILTERXML(A4,B4)"
]
]
}]
});
</script>
</html>
import React, { useRef } from "react";
import { Spreadsheet, Worksheet, jspreadsheet } from "@jspreadsheet/react";
import formula from "@jspreadsheet/formula-pro";
import "jsuites/dist/jsuites.css";
import "jspreadsheet/dist/jspreadsheet.css";
// Set license
jspreadsheet.setLicense('OGUyNGE1MzQ0ZDI1OTdjMDY0OTE2OGVmYzk4ZjhkNzNhMGZlY2Y3ZTNhZjdlYTJmYjUxNTE4YTZkNjZmOGQ3M2Q2YjU5ZjhjOGQyZTc1OTRjOTdmNDlmY2Y4ZDBlYTk0YTM3YTlhYmNlNjI2M2FmMGIyNDM5MjM3OGJlNWU1ZmMsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpVMk56a3pNRGMyTENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0p6ZEdGamEySnNhWFI2TG1sdklpd2lkMlZpWTI5dWRHRnBibVZ5TG1sdklpd2lkMlZpSWl3aWJHOWpZV3hvYjNOMElsMHNJbkJzWVc0aU9pSXpOQ0lzSW5OamIzQmxJanBiSW5ZM0lpd2lkamdpTENKMk9TSXNJbll4TUNJc0luWXhNU0lzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owWlhJaUxDSmlZWElpTENKMllXeHBaR0YwYVc5dWN5SXNJbk5sWVhKamFDSXNJbkJ5YVc1MElpd2ljMmhsWlhSeklpd2lZMnhwWlc1MElpd2ljMlZ5ZG1WeUlpd2ljMmhoY0dWeklpd2labTl5YldGMElsMHNJbVJsYlc4aU9uUnlkV1Y5');
// Set the extensions
jspreadsheet.setExtensions({ formula });
export default function App() {
// Spreadsheet array of worksheets
const spreadsheet = useRef();
// Worksheet data
const data = [
[
"XML Data",
"XPath Query",
"Result"
],
[
"<employees><employee><name>Alice Smith</name><department>Sales</department><salary>65000</salary></employee><employee><name>Bob Johnson</name><department>IT</department><salary>75000</salary></employee></employees>",
"//name",
"=FILTERXML(A2,B2)"
],
[
"<products><item id='1'><name>Laptop</name><price>899.99</price></item><item id='2'><name>Mouse</name><price>25.50</price></item><item id='3'><name>Keyboard</name><price>75.00</price></item></products>",
"sum(//price)",
"=FILTERXML(A3,B3)"
],
[
"<orders><order><customer>John Doe</customer><total>150.75</total></order><order><customer>Jane Smith</customer><total>89.50</total></order></orders>",
"//customer[1]",
"=FILTERXML(A4,B4)"
]
];
// Render component
return (
<Spreadsheet ref={spreadsheet}>
<Worksheet data={data} />
</Spreadsheet>
);
}
<template>
<Spreadsheet ref="spreadsheet">
<Worksheet :data="data" />
</Spreadsheet>
</template>
<script>
import { Spreadsheet, Worksheet, jspreadsheet } from "@jspreadsheet/vue";
import "jsuites/dist/jsuites.css";
import "jspreadsheet/dist/jspreadsheet.css";
import formula from "@jspreadsheet/formula-pro";
// Set license
jspreadsheet.setLicense('OGUyNGE1MzQ0ZDI1OTdjMDY0OTE2OGVmYzk4ZjhkNzNhMGZlY2Y3ZTNhZjdlYTJmYjUxNTE4YTZkNjZmOGQ3M2Q2YjU5ZjhjOGQyZTc1OTRjOTdmNDlmY2Y4ZDBlYTk0YTM3YTlhYmNlNjI2M2FmMGIyNDM5MjM3OGJlNWU1ZmMsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpVMk56a3pNRGMyTENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0p6ZEdGamEySnNhWFI2TG1sdklpd2lkMlZpWTI5dWRHRnBibVZ5TG1sdklpd2lkMlZpSWl3aWJHOWpZV3hvYjNOMElsMHNJbkJzWVc0aU9pSXpOQ0lzSW5OamIzQmxJanBiSW5ZM0lpd2lkamdpTENKMk9TSXNJbll4TUNJc0luWXhNU0lzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owWlhJaUxDSmlZWElpTENKMllXeHBaR0YwYVc5dWN5SXNJbk5sWVhKamFDSXNJbkJ5YVc1MElpd2ljMmhsWlhSeklpd2lZMnhwWlc1MElpd2ljMlZ5ZG1WeUlpd2ljMmhoY0dWeklpd2labTl5YldGMElsMHNJbVJsYlc4aU9uUnlkV1Y5');
// Set the extensions
jspreadsheet.setExtensions({ formula });
export default {
components: {
Spreadsheet,
Worksheet,
},
data() {
// Worksheet data
const data = [
[
"XML Data",
"XPath Query",
"Result"
],
[
"<employees><employee><name>Alice Smith</name><department>Sales</department><salary>65000</salary></employee><employee><name>Bob Johnson</name><department>IT</department><salary>75000</salary></employee></employees>",
"//name",
"=FILTERXML(A2,B2)"
],
[
"<products><item id='1'><name>Laptop</name><price>899.99</price></item><item id='2'><name>Mouse</name><price>25.50</price></item><item id='3'><name>Keyboard</name><price>75.00</price></item></products>",
"sum(//price)",
"=FILTERXML(A3,B3)"
],
[
"<orders><order><customer>John Doe</customer><total>150.75</total></order><order><customer>Jane Smith</customer><total>89.50</total></order></orders>",
"//customer[1]",
"=FILTERXML(A4,B4)"
]
]
return {
data
};
}
}
</script>
import { Component, ViewChild, ElementRef } from "@angular/core";
import jspreadsheet from "jspreadsheet";
import * as formula from "@jspreadsheet/formula-pro";
// Set your JSS license key (The following key only works for one day)
jspreadsheet.setLicense('OGUyNGE1MzQ0ZDI1OTdjMDY0OTE2OGVmYzk4ZjhkNzNhMGZlY2Y3ZTNhZjdlYTJmYjUxNTE4YTZkNjZmOGQ3M2Q2YjU5ZjhjOGQyZTc1OTRjOTdmNDlmY2Y4ZDBlYTk0YTM3YTlhYmNlNjI2M2FmMGIyNDM5MjM3OGJlNWU1ZmMsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpVMk56a3pNRGMyTENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0p6ZEdGamEySnNhWFI2TG1sdklpd2lkMlZpWTI5dWRHRnBibVZ5TG1sdklpd2lkMlZpSWl3aWJHOWpZV3hvYjNOMElsMHNJbkJzWVc0aU9pSXpOQ0lzSW5OamIzQmxJanBiSW5ZM0lpd2lkamdpTENKMk9TSXNJbll4TUNJc0luWXhNU0lzSW1Ob1lYSjBjeUlzSW1admNtMXpJaXdpWm05eWJYVnNZU0lzSW5CaGNuTmxjaUlzSW5KbGJtUmxjaUlzSW1OdmJXMWxiblJ6SWl3aWFXMXdiM0owWlhJaUxDSmlZWElpTENKMllXeHBaR0YwYVc5dWN5SXNJbk5sWVhKamFDSXNJbkJ5YVc1MElpd2ljMmhsWlhSeklpd2lZMnhwWlc1MElpd2ljMlZ5ZG1WeUlpd2ljMmhoY0dWeklpd2labTl5YldGMElsMHNJbVJsYlc4aU9uUnlkV1Y5');
// Set the extensions
jspreadsheet.setExtensions({ formula });
@Component({
standalone: true,
selector: "app-root",
template: `<div #spreadsheet></div>`
})
export class AppComponent {
@ViewChild("spreadsheet") spreadsheet: ElementRef;
// Worksheets
worksheets: jspreadsheet.worksheetInstance[];
// Create a new data grid
ngAfterViewInit() {
// Create spreadsheet
this.worksheets = jspreadsheet(this.spreadsheet.nativeElement, {
worksheets: [{
data: [
[
"XML Data",
"XPath Query",
"Result"
],
[
"<employees><employee><name>Alice Smith</name><department>Sales</department><salary>65000</salary></employee><employee><name>Bob Johnson</name><department>IT</department><salary>75000</salary></employee></employees>",
"//name",
"=FILTERXML(A2,B2)"
],
[
"<products><item id='1'><name>Laptop</name><price>899.99</price></item><item id='2'><name>Mouse</name><price>25.50</price></item><item id='3'><name>Keyboard</name><price>75.00</price></item></products>",
"sum(//price)",
"=FILTERXML(A3,B3)"
],
[
"<orders><order><customer>John Doe</customer><total>150.75</total></order><order><customer>Jane Smith</customer><total>89.50</total></order></orders>",
"//customer[1]",
"=FILTERXML(A4,B4)"
]
]
}]
});
}
}