2016-02-12 3 views
-1

У меня есть вызов на веб-сервис, который возвращает следующий необработанного ответJQuery не может найти элемент в XMLDocument только в Firefox

HTTP/1.1 200 OK 
Cache-Control: private 
Content-Length: 1516 
Content-Type: text/xml; charset=utf-8 
Server: Microsoft-IIS/8.5 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept 
Date: Fri, 12 Feb 2016 10:28:58 GMT 

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
     <OperationListResponse xmlns="http://tempuri.org/"> 
      <OperationListResult xmlns:a="http://schemas.datacontract.org/2004/07/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
       <a:data>123</a:data> 
       <a:operation_id i:nil="true"/> 
       <a:status>OK</a:status> 
      </OperationListResult> 
     </OperationListResponse> 
    </s:Body> 
</s:Envelope> 

Когда я получаю этот XML в моем коде яваскрипта, я пытаюсь прочитайте элемент «статус», используя следующий код:

//dataResponse is my javascript valid XMLDocument 
x = $(dataResponse).find('status').text(); 

И вместо получения «ОК», я получаю «». Это происходит только в Firefox. Странно то, что он отлично работает в Chrome, Opera, Edge и Safari. Во время отладки в Firefox, наблюдая за объектом dataResponse, я действительно вижу, что у узла «status» есть значение «OK».

enter image description here

Любой ключ о том, как решить эту проблему?

Редактировать: Я пробовал делать изменения, которые предложил Джай, и я получил странные результаты от firefox. Если я наблюдаю за переменной, которая делает «find», я могу видеть текст. Если я попытаюсь найти, просто набрав «$ (dados) .find (« a \: status »). Text()«, я не вижу никаких результатов. Firefox смотреть панель: enter image description here

Chrome часы панель: enter image description here

+3

'x = $ (dataResponse) .find ('a \\: status'). Text();' try with escaping the colon. – Jai

+0

Возможно, вам нужно поделиться еще одним кодом с частью запроса и тем, как вы его читаете и разбираете. –

+0

@Jai это имеет большой смысл. Добавьте ответ, конечно, он будет проверен как правильный. –

ответ

1

JQuery, вероятно, не имеет ничего общего с этим, помимо того, что это неправильный инструмент для работы. Для поиска элементов он в основном делегирует querySelectorAll. XML-документы имеют пространства имен и selectors have special handling для пространств имен.

Но сокращенные пространства имен требуют, чтобы сначала были отображены сопоставления от сокращенных имен к URI пространства имен. Например. XPath поиски сделать это с помощью пространства имен распознавателя аргумента Document.evaluate «s и селекторы в таблицах стилей извлекать их из @namespace declarations

querySelectorAll не принимают аргументы, которые поддерживают такое разрешение имен, поэтому только не-пространство имен, по умолчанию-имена и любым-имена селекторы могут быть указано.

Другими словами, это не возможно, чтобы соответствовать status элемент в пространстве имен a -> http://schemas.datacontract.org/2004/07/ с селектором a|status через querySelectorAll, на самом деле, он должен фактически throw an exception. И a:status будет просто селектором псевдоэлементов, который не известен браузеру.

Более общий селектор *|status должен соответствовать ему, но он может потенциально перенапрягать, также выбрав статусные элементы из других пространств имен.

Если вы хотите использовать обход пространства имен в документах XML, вы, вероятно, должны использовать XPath вместо этого.

2

Как я писал в комментариях, спасаясь от : с \\:

x = $(dataResponse).find('a\\:status').text(); 

Однако, это не имеет никакого смысла, что работал в других браузерах, но firefox.

+1

Это просто отлично работает в Firefox, но в Chrome теперь я получаю x = "" на панели "watch". Кроме того, вы пробовали: статус в Chrome, и он тоже не работал. – RSilva

Смежные вопросы