我有一个示例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完成?
答案 0 :(得分:1)
我认为XPath可能会解决您的问题。在处理旧的IE版本时要小心谨慎,API有一些差异。
您的方案的XPath表达式:/ root / asset / vin_7 [../ username / text()=“admin”]
编辑:阅读最近评论的问题,这个答案仅适用于每条记录都有自己的资产标签,并创建一个新的“根”标签。考虑到这一点,我已经更新了xpath。
答案 1 :(得分:1)
您可能忘记关闭资产代码。如果您在第一次不完整之后以及从XML的开头和结尾关闭资产标记,那么如果您将提供一个父标记,例如&lt; xml&gt;&lt; / xml&gt;,然后您可以通过以下方式解决您的问题。
$(test).find("asset").each(function() {
if($(this).find('username').text() == 'admin') {
alert($(this).find("vin_7").text())
}
});
注意:这里test是我分配了整个XML字符串的变量。
答案 2 :(得分:1)
假设上面显示的文件存储在服务器上的文件“audit.xml”中,下面的代码从服务器加载文件(还有其他方法从字符串中加载XML等)解析它并显示所选数据: / p>
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/
答案 3 :(得分:1)
您可以使用以下代码加载XML文件,并仅选择<vin_7>
为username
的{{1}}元素的内容。这使用了samuelgrigolato在他的回答中提到的XPath。
注意:我仅使用admin
行作为示例。使用它们不是一个好习惯。因此,请在实际代码中避免它们。
document.write