【问题标题】:Appcelerator Windows Phone XML Parsing ErrorAppcelerator Windows Phone XML 解析错误
【发布时间】:2016-03-07 12:38:23
【问题描述】:

我已经开始使用 Appcelerator 在 Windows Phone 上进行开发。我使用我的 Android 代码作为基础,在这样做的同时,我面临着 XML 解析的特殊问题。这是 XML 字符串:

<returnXml>
    <methodStatus>
        <statusType>success</statusType>
    </methodStatus>
    <parametersReturn />
</returnXml>

这是我要运行的代码:

var xml = Ti.XML.parseString(xmlString);
var statusType = xml.evaluate("/returnXml/methodStatus/statusType").item(0).text;

上面的代码在 Android 上运行良好,但在 Windows Phone 上我得到了:

TypeError: xml.evaluate 不是函数

所以我尝试使用以下代码:

getElementsByTagName("statusType")

但似乎 Windows phone 不支持这些功能,或者我在这里犯了一些错误。我应该做其他事情还是应该为 JavaScript 寻找外部 XML Parser 库?如果有,请指导。

【问题讨论】:

    标签: javascript xml windows-phone appcelerator appcelerator-titanium


    【解决方案1】:

    我们应该支持 Ti.XML.Document.evaluate 函数(和 getElementsByName)。要查看我们围绕 Ti.XML API 进行的单元测试,您可以查看此处:https://github.com/appcelerator/titanium_mobile_windows/blob/master/Examples/NMocha/src/Assets/ti.xml.test.js

    我们可能没有测试 XPath 的变体或您正在使用的 API。如果是这样,也许我们在那里测试的一些内容可以帮助您暂时解决问题,直到我们可以解决问题?在 JIRA 中提交一份包含有关您使用的 SDK 版本的详细信息的 buh 报告会很有帮助:https://jira.appcelerator.org/secure/CreateIssue!default.jspa

    目前,我创建了一个 PR,其中包含一个新的单元测试,试图重现您的问题:https://github.com/appcelerator/titanium_mobile_windows/pull/575 如果您有改进该测试的建议,我会很高兴。

    我可以说你的代码 sn-p 在尝试访问文本值时应该会失败,因为获取“文本”的属性是 textContent,所以它是:

    var statusType = xml.evaluate("/returnXml/methodStatus/statusType").item(0).textContent;
    

    http://docs.appcelerator.com/platform/latest/#!/api/Titanium.XML.Node-property-textContent

    虽然您可以在 XPath 表达式中一次性完成所有操作:

    var statusType = xml.evaluate("/returnXml/methodStatus/statusType[1]/text()");
    

    【讨论】:

    • 谢谢,问题是 DOM Level 3 API 尚未在 PR 中报告的 Windows Phone 实现。是的,getElementsByTagName 通过使用 textContent 而不是 text 工作。解决方法是使用 getElementsByTagName,但我如何实现它以类似于 xPath 表达式,因为我有多个路径节点要评估。当我必须访问路径中的特定节点但其他路径中也可能存在类似节点时,主要问题就出现了。即如何区分/path1/methodStatus/statusType/path2/otherStatus/statusType 中的statusType 节点?
    • 这不是很漂亮,但您可以执行 getElementsByTagName("statusType"),然后遍历结果并检查每个结果的 node.parentNode.tagName 以验证它是您想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 2013-01-11
    • 2012-01-22
    • 2015-10-18
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多