0

Я начал разработку на Windows Phone с помощью Appcelerator. Я использую код своего Android в качестве базы, и, делая это, я столкнулся с определенной проблемой анализа XML. Это XML-строка:Appcelerator Windows Phone XML Parsing Error

<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 is not a function

Так что я пытался использовать следующий код вместо:

getElementsByTagName("statusType")

Но кажется, что либо функции не поддерживаются для телефона Windows, либо я здесь ошибаюсь. Должен ли я делать что-то еще или я должен искать внешнюю библиотеку XML Parser для JavaScript? Если да, пожалуйста, обратитесь.

ответ

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, который вы используете. Если да, возможно, некоторые из тех, что мы тестируем, могут помочь вам временно решить проблему, пока мы не сможем исправить то, что ломается? Было бы полезно, если вы напишете отчет о buh в JIRA с подробной информацией о том, какую версию SDK вы используете: https://jira.appcelerator.org/secure/CreateIssue!default.jspa

На данный момент я создал PR с новым модульным тестом, пытающимся воссоздать ваш вопрос: https://github.com/appcelerator/titanium_mobile_windows/pull/575 Было бы хорошо знать, есть ли у вас предложения по улучшению этого теста.

Я могу сказать, что ваш фрагмент кода должен быть неудачной попытке доступа к текстовое значение, так как свойства для получения «текст» является 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()"); 
+0

Спасибо, проблема в том, что DOM Level 3 API не был реализован для Windows Phone, как сообщается в PR. И да, ** getElementsByTagName ** работает с использованием _textContent_ вместо _text_. Обходным путем является использование ** getElementsByTagName **, но как его реализовать, чтобы работать аналогично выражению xPath, поскольку у меня есть несколько узлов пути для оценки. Основная проблема возникает, когда я должен получить доступ к определенному узлу в Пути, но могут быть аналогичные узлы и на других путях. i.e Как я различаю узлы statusType в '/ path1/methodStatus/statusType' и'/path2/otherStatus/statusType'? –

+0

Ну, это некрасиво, но вы можете сделать getElementsByTagName ("statusType"), затем перебрать результаты и проверить node.parentNode.tagName для каждого, чтобы убедиться, что это то, что вы хотите. –