From c6efe2a2ddeaab23470bda743d8cc0d79a94abd4 Mon Sep 17 00:00:00 2001 From: Josh Johnson Date: Mon, 18 Jan 2016 08:53:42 -0500 Subject: [PATCH] Fix #22 --- package.json | 5 +++++ src/providers/XPath.ts | 5 ++++- src/services/XPathEvaluator.ts | 10 +++++++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 6e2b1df..c468db8 100644 --- a/package.json +++ b/package.json @@ -78,6 +78,11 @@ "type": "array", "default": ["-xquery", "$(script)", "-in", "$(input)", "-out", "$(input).output.xml"], "description": "Arguments to be passed to the execution engine. '$(script)' and '$(input)' refer to the XQuery script and input XML file, respectively." + }, + "xmlTools.ignoreDefaultNamespace": { + "type": "boolean", + "default": true, + "description": "Ignores default xmlns attribute when evaluating XPath." } } }, diff --git a/src/providers/XPath.ts b/src/providers/XPath.ts index 019ff8a..374268f 100644 --- a/src/providers/XPath.ts +++ b/src/providers/XPath.ts @@ -6,6 +6,7 @@ import { XPathEvaluator } from '../services/XPathEvaluator'; const CFG_SECTION: string = 'xmlTools'; const CFG_PERSIST_QUERY: string = 'persistXPathQuery'; +const CFG_IGNORE_DEFAULT_XMLNS: string = 'ignoreDefaultNamespace'; const MEM_QUERY_HISTORY: string = 'xpathQueryHistory'; const MEM_QUERY_LAST: string = 'xPathQueryLast'; const OUTPUT_CHANNEL: string = 'XPath Results'; @@ -54,9 +55,11 @@ export class XPathFeatureProvider { // showInputBox() will return undefined if the user dimissed the prompt if (query) { + let ignoreDefaultNamespace: boolean = vsc.workspace.getConfiguration(CFG_SECTION).get(CFG_IGNORE_DEFAULT_XMLNS, true); + // run the query let xml: string = editor.document.getText(); - let nodes: Node[] = XPathEvaluator.evaluate(query, xml); + let nodes: Node[] = XPathEvaluator.evaluate(query, xml, ignoreDefaultNamespace); // show the results to the user let outputChannel: vsc.OutputChannel = vsc.window.createOutputChannel(OUTPUT_CHANNEL); diff --git a/src/services/XPathEvaluator.ts b/src/services/XPathEvaluator.ts index 970a8f8..09bc0be 100644 --- a/src/services/XPathEvaluator.ts +++ b/src/services/XPathEvaluator.ts @@ -5,10 +5,18 @@ import * as xpath from 'xpath'; let DOMParser = require('xmldom').DOMParser; export class XPathEvaluator { - static evaluate(query: string, xml: string): Node[] { + static evaluate(query: string, xml: string, ignoreDefaultNamespace: boolean): Node[] { + if (ignoreDefaultNamespace) { + xml = xml.replace(/xmlns=".+"/g, (match: string) => { + return match.replace(/xmlns/g, 'xmlns:default'); + }); + } + let nodes: Node[] = new Array(); let xdoc: Document = new DOMParser().parseFromString(xml, 'text/xml'); + console.log(xdoc); + let resolver: xpath.XPathNSResolver = xpath.createNSResolver(xdoc); let expression: xpath.XPathExpression = xpath.createExpression(query, resolver); let result: xpath.XPathResult = expression.evaluate(xdoc, xpath.XPathResult.ORDERED_NODE_ITERATOR_TYPE);