Как запросить строку XML через DOM в jQuery - PullRequest
4 голосов
/ 20 мая 2009

Я хотел бы взять строку и рассматривать ее как XML. Тогда я смогу делать запросы в DOM через jQuery.find. В Firefox все работало нормально, но я понял, что в IE это не работает.

Я делаю это:

  var t = "<div><outer><inner>abc</inner><inner>def</inner></outer></div>";
  alert("[" + $(t).find("outer").html() + "]");

В Firefox 3 он печатает:

[<inner>abc</inner><inner>def</inner>]

В IE 7 он печатает:

[]

Какие-нибудь обходные пути для того, чтобы заставить это работать через браузеры?

Спасибо.

Ответы [ 8 ]

9 голосов
/ 21 мая 2009

Есть 2 способа подойти к этому.

  1. Преобразуйте строку XML в DOM, проанализируйте ее с помощью этого плагина или следуйте этому учебнику
  2. Преобразование XML в JSON с помощью этого плагина .
4 голосов
/ 21 мая 2009

Можно ли сохранить XML как JSON (я бы предположил, что это будет)? Например, в PHP вы можете преобразовать XML в массив или объект, а затем преобразовать его в JSON с помощью json_encode. Затем вы можете отобразить это как переменную javascript следующим образом:

В PHP:

<?php
$xml = "<div><outer><inner>abc</inner><inner>def</inner></outer></div>";
$xml_object = simplexml_load_string(xml);
$json = json_encode($xml_object);
?>
<script language="javascript">
$(function() {
    // eval() is okay to use if you know where the JSON is 
    // coming from (and, of course, you do...) 
    var data = eval('<?php echo $json; ?>');
    $(document).data('myapp.data',data);
});
</script>

И теперь, когда вам нужен доступ к этим данным, вы можете просто получить их так:

function some_function() {
    var data = $(document).data('myapp.data');
    $.each(data.div.outer,function() {
        // Would alert 'abc' then 'def'
        alert(this.inner);
    });
}

Надеюсь, все это имеет смысл. По крайней мере, вам больше не придется беспокоиться о XML на стороне клиента. Конечно, если вам абсолютно необходимо, я обнаружил, что это работало для меня в прошлом:

var xml = "<div><outer><inner>abc</inner><inner>def</inner></outer></div>";
var $xml = $('<div />').append(xml);
alert("[" + $xml.find("outer").html() + "]");

Редактировать Я изменил свой код, чтобы использовать фактический XML-файл, который вы предоставляете - не уверен, где я там перепутал (должно быть, случайно взял фрагмент из чужого ответа) Вы действительно должны дать мне первое предложение - оно должно сработать.

3 голосов
/ 10 ноября 2011

Поместите строку XML в переменную Javascript:

var xmlString = $('<?xml version="1.0"?><Customers><Customer Name="Allan Border" Age="26" ContactNumber="004416165245" Address="Unit # 24 East London" City="London" Country="England"></Customer><Customer Name="Jennifer" Age="28" ContactNumber="004416165248" Address="Unit # 28 West London" City="London" Country="England"></Customer></Customers>');

Теперь вы можете анализировать XML, просматривая каждый из клиентских узлов:

$(xmlString).find("Customer").each(function () {
 var customerName = $(this).attr("Name");
 var age = $(this).attr("Age");
 var contactNumber = $(this).attr("ContactNumber");
 var address = $(this).attr("Address");
 var city = $(this).attr("City");
 var country = $(this).attr("Country");
 });
1 голос
/ 24 декабря 2010

В Javascript для Selenium чтение XML-файла в браузере:

function loadXMLFromDOM2XMLString( xmlString, xmltag, currentChildNode ) { 
var nodes = currentChildNode.childNodes; 
var i = 0 ;
var node = nodes[i];
while ( i < nodes.length) {
   if (node.data == null) {xmltag = '<'+node.localName+'>';} else {xmltag = node.data;};
   xmlString = xmlString  + xmltag;
   xmlString = loadXMLFromDOM2XMLString( xmlString, xmltag, node  );   
   if (node.data == null) {xmltag = '<'+'/'+node.localName+'>';} else {xmltag = "";};
   xmlString = xmlString + xmltag;
   i++;
   node = nodes[i];
}
 return xmlString ;
} ;
var xmlString = "";
var xmltag = "";

var currentChildNode = window.document;

xmlString = loadXMLFromDOM2XMLString( xmlString, xmltag, currentChildNode );
xmlString;
1 голос
/ 20 мая 2009

Во-первых, конструктор jQuery принимает HTML, а не XML ... это означает, что ваш XML может работать - но это зависит от поведения, зависящего от браузера. Кроме того, вы можете добиться большего успеха, добавляя вновь созданные элементы к скрытому элементу на странице, а затем пытаясь запросить его:

var xml = "<books><book><title>Title</title></book></books>";
$(xml).appendTo("#hidden");
alert($("#hidden books").length);
0 голосов
/ 03 февраля 2010

Это было давно, но я только что понял, что забыл опубликовать, как я решил проблему с вашими объединенными идеями.

Мне нужна была полностью клиентская база данных (без PHP).

Я создал div с комментарием HTML, содержащим XML. Я проанализировал HTML-комментарий с этим , а затем я преобразовал XML в JSON с этим .

   var xmltext = $("#piecelist").comments();
   var json = $.xml2json(xmltext.html());

Вы можете увидеть мой метод в действии здесь: http://wesculpt.net/art.html

Может быть, я должен превратить этот метод в плагин jQuery.

Спасибо за вашу помощь всем.

0 голосов
/ 21 мая 2009

Так что вместо того, чтобы хранить набор данных XML в DOM, преобразуйте его в таблицу HTML и сделайте его невидимым. Это должно решить проблемы jQuery ... по крайней мере, специфичные для браузера проблемы. Затем вернитесь к работе по уточнению ваших селекторов.

0 голосов
/ 21 мая 2009

При наличии строки xml, т.е. вам нужно использовать .filter, так как он не хочет распознавать дерево узлов xml.

Попробуйте это в ie8 с видимым отладчиком, чтобы получить вывод консоли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...