0

我有一个示例 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 怎么能做到这一点?

4

4 回答 4

1

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

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

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

于 2013-08-16T14:16:31.810 回答
1

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

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

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

于 2013-08-16T14:01:55.097 回答
1

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

于 2013-08-16T14:28:42.327 回答
1

您可以使用以下代码加载 XML 文件并仅选择<vin_7>usernameadmin. 这使用了 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();
    }
}
于 2013-08-16T14:29:21.283 回答