Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在jQuery中通过DOM查询XML字符串_Jquery_Dom - Fatal编程技术网

如何在jQuery中通过DOM查询XML字符串

如何在jQuery中通过DOM查询XML字符串,jquery,dom,Jquery,Dom,我想获取一个字符串并将其作为XML处理。然后我将能够通过jQuery.find使用DOM进行查询。在Firefox中一切正常,但我意识到这在IE中不起作用 我正在这样做: var t = "<div><outer><inner>abc</inner><inner>def</inner></outer></div>"; alert("[" + $(t).find("outer").html()

我想获取一个字符串并将其作为XML处理。然后我将能够通过jQuery.find使用DOM进行查询。在Firefox中一切正常,但我意识到这在IE中不起作用

我正在这样做:

  var t = "<div><outer><inner>abc</inner><inner>def</inner></outer></div>";
  alert("[" + $(t).find("outer").html() + "]");
有什么办法可以让它跨浏览器工作吗


谢谢。

首先,jQuery构造函数采用HTML而不是XML。。。也就是说,您的XML可以工作,但它取决于许多依赖于浏览器的行为。此外,如果将新创建的元素附加到页面上某个位置的隐藏元素,然后尝试查询该元素,则可能会获得更好的成功:

var xml = "<books><book><title>Title</title></book></books>";
$(xml).appendTo("#hidden");
alert($("#hidden books").length);
var xml=“Title”;
$(xml).appendTo(#hidden”);
警报($(“#隐藏的书籍”)。长度);

有两种方法可以实现这一点

  • 将XML字符串转换为DOM,使用该字符串对其进行解析或遵循以下步骤
  • 使用以下命令将XML转换为JSON
    是否可以将XML存储为JSON(我假设是这样)?例如,在PHP中,您可以将XML转换为数组或对象,然后使用
    JSON\u encode
    将其转换为JSON。然后,您可以将其作为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 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;
    
    我希望这一切都有意义。至少在客户端,您不必再担心XML了。当然,如果你确实需要的话,我发现这在过去对我很有效:

    var xml = "<div><outer><inner>abc</inner><inner>def</inner></outer></div>";
    var $xml = $('<div />').append(xml);
    alert("[" + $xml.find("outer").html() + "]");
    
    var xml=“abcdef”;
    var$xml=$('').append(xml);
    警报(“[”+$xml.find(“outer”).html()+“]”);
    
    编辑
    我修改了我的代码以使用您提供的实际XML——不确定我在哪里弄混了(一定是从其他人关于意外事件的答案中抓取的片段)。你真的应该给我的第一个建议一个机会——它应该会起作用。

    对于ie中的字符串xml,你需要使用.filter,因为它不想识别xml节点树


    尝试在ie8中使用可见的调试器来获取控制台输出。

    那么,与其将XML数据集存储在DOM中,不如将其转换为HTML表并使其不可见。这应该可以解决jQuery的问题。。。至少是浏览器特定的问题。然后继续改进您的选择器。

    已经有一段时间了,但我刚刚意识到我忘了发布我是如何用您的组合想法解决问题的

    我需要一个完全的客户端数据库(没有PHP)

    我创建了一个div,其中包含一个包含XML的HTML注释。我,然后我

    您可以在此处看到我的方法的作用:

    也许我应该把这个方法变成jQuery插件


    感谢大家的帮助。

    在浏览器中读取XML文件的Javascript for Selenium:

    <?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 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;
    
    函数loadXMLFromDOM2XMLString(xmlString,xmltag,currentChildNode){
    var nodes=currentChildNode.childNodes;
    var i=0;
    var节点=节点[i];
    while(i
    将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,它似乎包含语法错误。Woops。我没有匹配XML标记。但这并不重要。问题仍然存在。我匹配了代码示例中的标记。现在它更具可读性。有什么想法吗?我现在有答案了。但每当我发布它时,它都不会出现。有什么想法吗?嗯,你的想法对我来说也有同样的结果。在FF工作,但不是IE。也许我会提我更大的问题。我有一个要作为数据库查询的内容列表。但我想在客户端完成这一切。这意味着我不能提出.ajax请求。因此,我将列表作为XML数据库隐藏在页面本身中。在评论中,在HTML分区中。有点奇怪,但我找不到其他方法来维护这个表。也许我忽略了一个更简单的方法?您的客户端示例alert()生成“[null]”。通过将$xml.find(“outer”)替换为.find(“books”)来修复它,在FF中工作,但在IE中产生“[]”,这正是@Jono报告的原始问题。哦,耶,呜呜。。。哈哈;我没有将完整的XML放入字符串中。但是IE问题太糟糕了。我想知道他是否尝试过我的JSON方法。我不能仅仅制作一个HTML表,因为它是一个嵌套的数据集。这就是我使用XML的原因。因此,我只是尝试将XML放在一个隐藏的div中。我希望这个方法能够工作,但由于以下原因它不能工作。我需要确保我的XML标记不会与HTML标记(ie-Title)冲突。所以我这样做了,但是jQuery选择器在IE中找不到这些标记。在FF中,可以搜索任何组合的标记。但IE似乎将我限制在HTML子集。仅供参考,您也可以嵌套表。。。不管怎样,如果我在一个问题上花了太长时间,而它却没有任何进展,或者它太复杂。。。这通常意味着我走错了方向。我认为您最好使用JSON来序列化您的结构,或者使用类似google gears的东西在客户端上持久化它——如果可以的话。是的。我正在研究JSON解决方案。我很好奇你提到google gears是什么意思。gears可以跨页面加载保存数据,所以你不必在每次请求时都通过网络发送数据。非常感谢。这是我一直在尝试的两个非常好的插件。如果您检查插件源代码,它会使用ActiveX对象将xml字符串转换为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;
    
    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>');
    
    $(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");
     });