我正在开发一个cordova 4.3.1应用程序,它必须在解压缩后修改从xlsx和pptx文档中读取的xml代码。为此,我们使用jquery的$.parseXML
方法,然后在xml中执行一些更改。要到达我们需要更改xml的标记,我们使用jquery的find
方法。一切都适用于iOS。但是,当我们在Windows 8.1上测试它时,有时find
在调用一些pptx的xml时返回一个空的jquery结果(xlsx工作正常,但我们使用find
的次数比pptx少得多)。
我已经看过find
不起作用的对象,它看起来和iOS上的一样(大多数对象的内容是相同的,有些元素只出现在iOS上(例如baseURI
,currentScript
),多个只出现在Windows上(例如alinkcolor
,all
,ATTRIBUTE_NODE
))。我注意到的一个可疑的事情是,xml对象的location属性在Windows上包含“对方法或属性访问的意外调用”,而在iOS上则为null。
此外,由于xml是由Excel和Powerpoint生成的,我相信它是有效的。
有没有人知道为什么在Windows上发生这种行为?我的搜索主要发现人们在没有find
的情况下使用$.parseXML
方法的问题,而这种情况并非如此。
在xlsx上,适用于两者:
初始化:this.xmlData = $.parseXML(this.zip.file(sheetZipPath).asText());
工作查找:var cells = $(this.xmlData).find("c");
在pptx上,仅适用于iOS:
初始化(适用于两者):this.currentSlideXML = $.parseXML(this.zipContent.file(slideZipPath).asText();
无法工作查找:var paragraphs = $(this.currentSlideXML).find("p");
考虑到上面这一行,当我在它上面放一个断点并尝试不同的选择器时,它们位于一定数量的childNodes
(甚至是“sld”,在这种情况下就在文档的正下方),我总是得到一个空的搜索结果(即一个长度为0的jquery对象)。
考虑到它的大小,我无法在这里复制xml,但是如果你创建一个pptx或xlsx文件,保存它,将其重命名为.zip然后解压缩它,你可以找到一个具有类似结构的文件
我在使用jquery的find
解析的XML上使用Windows上的parseXML
方法时会出现奇怪的行为,我想知道我的代码中是否遗漏了一个明显的错误,或者如果有一些解释为什么在Windows上发生这种情况而不是在iOS上。
答案 0 :(得分:0)
原来问题是XML命名空间。对于pptx文件,解析了xml,同时考虑了nodeName中的标记命名空间。所以,当jquery尝试匹配我的选择器时,它没有找到它应该的标签,因为选择器与nodeName完全不同(例如:我使用的是find("p")
,但是节点被称为" a:p",所以我需要改为使用find("a\\:p")
。
所以最后,它在iOS上而不是在Windows上工作,因为两个平台都使用不同的xml解析器。