如何使用jQuery从XML中查找/提取数据

7

我正在尝试从下面的xml中提取StateLongName和StateShortName值。

我知道使用jQuery可以有一种简单优雅的方法来实现这一点。

<NewDataSet>
  <Table>
    <StateLongName>Alabama</StateLongName>
    <StateShortName>AL</StateShortName>
  </Table>
  <Table>
    <StateLongName>Alaska</StateLongName>
    <StateShortName>AK</StateShortName>
  </Table>

...elments removed for brevity

</NewDataSet>

以下是我尝试过的方法。

将上面的 xml 加载到一个名为 xml 的 Javascript 变量中。

尝试 #1

$(xml).find("TABLE").each(function()
{
  var stateName = $(this).find("StateLongName").innerText;
  var stateCode = $(this).find("StateShortName").innerText;
});

第一次尝试没有找到任何内容,也没有进入加载stateName和stateCode变量的内部。

尝试 #2

$(xml).find("StateLongName").each(function()
{
  var stateName = $(this).find("StateLongName").innerText;
  var stateCode = $(this).find("StateShortName").innerText;
});

尝试 #2 找到了匹配项,但是 stateName 和 stateCode 未定义。
尝试 #3:
$(xml).find("StateLongName").each(function()
{
  var stateName = $($(xml).find('StateLongName').parent()[0].innerHTML)[1].data;
  var stateCode = $($(xml).find('StateLongName').parent()[0].innerHTML)[5].data;
});

尝试#3可以,但应该有更好的方法。请给我指点迷津。
感谢您的时间!

请忽略我的回答 - 我以为你的问题更加普遍! - Vivin Paliath
2个回答

8

这是区分大小写的,使用"Table"就像这样:

$(xml).find("Table").each(function() {
  var stateName = $(this).find("StateLongName").text();
  var stateCode = $(this).find("StateShortName").text();
});

更新:抱歉,这个有点令人困惑,请不要使用<table>,它将其视为html并创建一个<tbody>,从那里开始事情变得更加奇怪 :) 如果您将其更改为其他任何内容,它都将正常工作,下面是将其更改为<tabl>的示例:http://jsfiddle.net/Yvetc/ 以下是完整的裸测试页面:
<html>
  <head>    
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script type="text/javascript">
    var xml="<NewDataSet><Tabl><stateLongName>Alabama</stateLongName><stateShortName>AL</StateShortName></Tabl><Tabl><StateLongName>Alaska</StateLongName><StateShortName>AK</StateShortName></Tabl></NewDataSet>";
    $(xml).find("Tabl").each(function() {
      var stateName = $(this).find("StateLongName").text();
      var stateCode = $(this).find("StateShortName").text();
      alert("State: " + stateName + " Code: " + stateCode);
    });
    </script>
  </head>
  <body>
  </body>
</html>

这种行为是特定于浏览器的吗?Nick的原始示例在Chrome上对我有效。 - Anurag
@Anurag - 它运行正常是因为我更改了 xml 文件,使其不再包含 <table> 而是 <tabl>,这似乎在文档片段中造成了很大的混乱。 - Nick Craver
@Nick,区别在于我使用了DOMParser来构建DOM。jQuery尝试附加到DOM以获取节点,这依赖于HTML作为主机。 - Anurag
仅作为背景信息...我正在尝试从一些返回 .Net DataSet 的内部 Web 服务中获取国家和州列表。我使用 $.ajax 直接从浏览器调用 Web 服务。然而,这只在 IE 中有效。我不确定为什么,但似乎与身份验证/跨域问题有关。无论如何,现在我正在调用代码后台中的 PageMethod 并返回 dsStates.GetXml(),dsStates 是一个 .Net DataSet。这就是为什么 xml 格式是这样的原因。 - user307199
似乎是浏览器问题。我从您提供的代码中创建了一个简单的测试页面。它在Firefox 3.6.2和Chrome 4.1.249.1042(42199)中可以工作,但在IE 8.0.6001.18702中无法工作。我正在运行XP Pro。这很令人失望,jQuery的优美之处之一应该是跨浏览器兼容性。自'95年以来,我一直在等待真正的浏览器兼容性,哦好吧,够了抱怨。 - user307199
显示剩余5条评论

2
$.ajax({
             type: "GET",
             url: "labels.xml",
             dataType: "xml",
             success: function(xml) {
                 $(xml).find('label').each(function(){
                     var id_text = $(this).attr('id')
                     var name_text = $(this).find('name').text()

                     $('<li></li>')
                         .html(name_text + ' (' + id_text + ')')
                         .appendTo('#update-target ol');
                 }); //close each(
             }
         }); //close $.ajax(

以下是示例xml:

<?xml version="1.0" encoding="iso-8859-1"?>


<labels>
   <label id='ep' added="2003-06-10">
     <name>Ezra Pound</name>
     <address>
       <street>45 Usura Place</street>
       <city>Hailey</city>
       <province>ID</province>
     </address>
   </label>
   <label id='tse' added="2003-06-20">
     <name>Thomas Eliot</name>
     <address>
       <street>3 Prufrock Lane</street>
       <city>Stamford</city>
       <province>CT</province>
     </address>
   </label>
   <label id="lh" added="2004-11-01">
     <name>Langston Hughes</name>
     <address>
       <street>10 Bridge Tunnel</street>
       <city>Harlem</city>
       <province>NY</province>
     </address>
   </label>
   <label id="co" added="2004-11-15">
     <name>Christopher Okigbo</name>
     <address>
       <street>7 Heaven's Gate</street>
       <city>Idoto</city>
       <province>Anambra</province>
     </address>
   </label>
 </labels>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接