如何使用javascript在XML文件中查询数据

How to query data in a XML file usin javascript?

本文关键字:查询 数据 文件 XML 何使用 javascript      更新时间:2023-09-26

我有一个示例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>

我想得到一个'vin_7'元素的列表,其中username='admin'。如何使用JavaScript实现这一点?

您可以使用以下代码加载XML文件,并仅选择usernameadmin<vin_7>元素的内容。这使用了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();
    }
}

我认为XPath可能会解决您的问题。只是在处理旧的IE版本时要谨慎,API有一些不同。

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

编辑:阅读问题最近的评论,这个答案只适用于每个记录都有自己的资产标签,并且创建了一个新的"根"标签的情况。考虑到这一点,我已经更新了xpath。

假设上面显示的文件存储在服务器上的文件"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/

您可能忘记关闭资产标记。如果您在第一个不完整的XML之后以及从XML的开始和结束关闭您的资产标记,如果您将提供一个父标记,例如<xml><xml>,则可以使用以下方法解决问题。

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

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