0

I'm trying to search for particular nodes in office xml. I'm using wgxpath for it. Here is my code. But every time empty result is returned. Probably wgxpath doesn't work with namespaces (although it accepts nsResolver as parameter)

Word.run(function (ctx) {
    var xml = ctx.document.body.getOoxml();
    ctx.sync().then(function () {
        try {
            var parser = new DOMParser();
            var doc = parser.parseFromString(xml, "text/xml");
            var win = { 'document': doc };
            wgxpath.install(win);
            var nsResolver = doc.createNSResolver(doc.ownerDocument == null ? doc.documentElement : doc.ownerDocument.documentElement);
            var result = doc.evaluate("/pkg:package/pkg:part/pkg:xmlData/w:styles/w:docDefaults/w:pPrDefault/w:pPr/w:spacing", doc, nsResolver, win.XPathResult.ANY_TYPE, null);
            var items = [];
            try {
                var item = result.iterateNext();
                while (item) {
                    items.push(item);
                    item = result.iterateNext();
            }
        }
        catch (e) {
            reject(e);
        }
        resolve(items);
    });
});

I've also tried another example with simple xml:

var parser = new DOMParser();
var test = "<pkg:count xmlns:pkg='http://schemas.microsoft.com/office/2006/xmlPackage'><pkg:a>1</pkg:a></pkg:count>";
var doc = parser.parseFromString(test, "text/xml");
var win = { 'document': doc };
wgxpath.install(win);
var nsResolver = function(prefix) {
    var ns = {
        'pkg': 'http://schemas.microsoft.com/office/2006/xmlPackage'
    };
    return ns[prefix] || null;
}
var result = doc.evaluate('/pkg:count/pkg:a', doc, nsResolver, win.XPathResult.ANY_TYPE, null);

Result is the same: with prefixes empty result is returned, but if I remove prefixes, evaluation works.

How can I evaluate xml with namespaces in office add ins? Any other solution? I've tried to use ActiveXObject("Microsoft.XMLDOM"), but get "Can't create object" exception.

Sergey Mozhaykin
  • 192
  • 1
  • 10

1 Answers1

0

The built in XML parsing methods do support namespaces, but not xpath.

E.g. Document.getElementsByTagNameNS

lgaud
  • 2,430
  • 20
  • 30