【问题标题】:How to query data in a XML file usin javascript? [closed]如何使用 javascript 查询 XML 文件中的数据? [关闭]
【发布时间】:2013-08-18 22:57:58
【问题描述】:

我有一个示例 XML 文件如下:

  <audit>
     <asset>
         <user_Id>1</user_Id>
         <username>admin</username>
         <asset_id>1001</asset_id>
         <vin_7>2217841</vin_7>
         <make>xyz</make>
         <model>x5</model>
         <color>red</color>
         <reg_no>1234</reg_no>
         <note>null</note>
         <geopoint>
             <geo_lat>-6.23</geo_lat>
             <geo_long>50.43</geo_long>
         </geopoint>
         <status>incomplete</status>
     </asset>
     <asset>
         <user_Id>1</user_Id>
         <username>admin</username>
         <asset_id>1001</asset_id>
         <vin_7>2227841</vin_7>
         <make>abc</make>
         <model>x4</model>
         <color>blue</color>
         <reg_no>unknown</reg_no>
         <note>null</note>
         <location>test street</location>
         <geopoint>
             <geo_lat>-6.33</geo_lat>
             <geo_long>50.22</geo_long>
         </geopoint>
         <status>incomplete</status>
     </asset>
 </audit>

我想获取用户名='admin' 的 'vin_7' 元素列表。使用 JavaScript 怎么能做到这一点?

【问题讨论】:

  • 一个资产标签可以有多个用户名和vin_7标签?还是样本错误?我们如何找到哪个 vin_7 元素属于哪个用户名?
  • 是的,我认为您缺少打开/关闭的资产标签
  • @YuriyGalanter 是的,我已经编辑了示例。抱歉,以前从未使用过 XML,将不胜感激。
  • @Harry 样本有问题...资产的数量被分配了不同的用户名和 vin_7 值...。我想获取具有特定用户名的 vin_7 列表,例如“admin”.. . 通过 javascript 实现这一目标的最佳方法是什么?

标签: javascript xml xpath xml-parsing


【解决方案1】:

您可能忘记关闭资产标签。如果您在第一次不完整并且从 XML 的开头和结尾关闭资产标签,如果您将提供一个父标签,例如 /xml >,那么您可以通过以下方式解决您的问题。

$(test).find("asset").each(function() {
    if($(this).find('username').text() == 'admin') {
        alert($(this).find("vin_7").text())
    }
});

注意:这里的 test 是我分配整个 XML 字符串的变量。

【讨论】:

    【解决方案2】:

    您可以使用下面的代码加载 XML 文件并仅选择 usernameadmin&lt;vin_7&gt; 元素的内容。这使用了 samuelgrigolato 在他的回答中提到的 XPath。

    注意:我只使用了document.write 行作为示例。使用它们不是一个好习惯。因此,请在您的实际代码中避免使用它们。

    function loadXMLDoc(dname) {
        if (window.XMLHttpRequest) {
            xhttp = new XMLHttpRequest();
        } else {
            xhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        xhttp.open("GET", dname, false);
        xhttp.send("");
        return xhttp.responseXML;
    }
    
    xml = loadXMLDoc("asset.xml"); //Your input file name
    path = " /audit/asset/vin_7[../username/text() = \"admin\"]"; //The XPath Condition
    // code for IE
    if (window.ActiveXObject) {
        var nodes = xml.selectNodes(path);
        for (i = 0; i < nodes.length; i++) {
            document.write(nodes[i].childNodes[0].nodeValue);
            document.write("<br>");
        }
    }
    // code for Mozilla, Firefox, Opera, etc.
    else if (document.implementation && document.implementation.createDocument) {
        var nodes = xml.evaluate(path, xml, null, XPathResult.ANY_TYPE, null);
        var result = nodes.iterateNext();
        while (result) {
            document.write(result.childNodes[0].nodeValue);
            document.write("<br>");
            result = nodes.iterateNext();
        }
    }
    

    【讨论】:

      【解决方案3】:

      假设上面显示的文件存储在服务器上的文件“audit.xml”中,以下代码从服务器加载文件(还有其他方法可以从字符串加载 XML 等)解析它并显示选定的数据:

      if (window.XMLHttpRequest) xmlhttp=new XMLHttpRequest();
      else  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      
      xmlhttp.open("GET","audit.xml",false);
      xmlhttp.send();
      xmlDoc = xmlhttp.responseXML;
      
      xNodes = xmlDoc.selectNodes("/audits/asset[username='admin']/vin_7")
      
      for (i = 0; i < xNodes.length; i++) {
          alert(xNodes[i].text)
      }
      

      此代码适用于 IE,其 XmlDocument 支持“selectedNodes”方法。对于其他浏览器,您可能需要添加该方法的实现,例如http://richardpianka.com/2011/01/cross-browser-xpath/

      【讨论】:

        【解决方案4】:

        我认为XPath 可能会解决您的问题。处理旧IE版本时要小心,API有一些差异。

        您的场景的 XPath 表达式:/root/asset/vin_7[../username/text() = "admin"]

        编辑:阅读最近 cmets 的问题,此答案仅适用于如果每条记录都在其自己的资产标签内,并且创建了一个新的“根”标签。考虑到这一点,我已经更新了 xpath。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-17
          • 1970-01-01
          • 1970-01-01
          • 2020-03-07
          • 1970-01-01
          相关资源
          最近更新 更多