使用JQuery解析XML

时间:2009-09-01 14:40:11

标签: jquery xml parsing

我正在查询Microsoft Office SharePoint Server搜索服务,以将一些结果写入Web部件。我的查询工作正常但是在通过JQuery解析xml响应时遇到了一些麻烦。

以下是XML响应

<ResponsePacket xmlns="urn:Microsoft.Search.Response">
  <Response domain="QDomain">
  <Range>
  <StartAt>1</StartAt> 
  <Count>1</Count> 
  <TotalAvailable>1</TotalAvailable> 
  <Results>
  <Document xmlns="urn:Microsoft.Search.Response.Document">
  <Action>
  <LinkUrl fileExt="aspx">https://mysite.domain.inc:443/Person.aspx?guid=4A4F27E2 9C99 4866 BB08 DE494475A4E7</LinkUrl> 
  </Action>
  <Properties xmlns="urn:Microsoft.Search.Response.Document.Document">
  <Property>
  <Name>TITLE</Name> 
  <Type>String</Type> 
  <Value>Smith, Joseph</Value> 
  </Property>
  <Property>
  <Name>RANK</Name> 
  <Type>Int64</Type> 
  <Value>873</Value> 
  </Property>
  <Property>
  <Name>SIZE</Name> 
  <Type>Int64</Type> 
  <Value>0</Value> 
  </Property>
  <Property>
  <Name>DESCRIPTION</Name> 
  <Type>String</Type> 
  <Value>Hi guys!</Value> 
  </Property>
  <Property>
  <Name>WRITE</Name> 
  <Type>DateTime</Type> 
  <Value>2009 07 31T03:00:24 04:00</Value> 
  </Property>
  <Property>
  <Name>PATH</Name> 
  <Type>String</Type> 
  <Value>https://mysite.domain.inc:443/Person.aspx?guid=4A4F27E2 9C99 4866 BB08 DE494475A4E7</Value> 
  </Property>
  <Property>
  <Name>JOBTITLE</Name> 
  <Type>String</Type> 
  <Value>Programmer</Value> 
  </Property>
  </Properties>
  </Document>
  </Results>
  </Range>
  <Status>SUCCESS</Status> 
  </Response>
  </ResponsePacket>

我正在尝试使用JQuery获得TITLE,即Smith,Joseph和JOBTITLE,即程序员。

我开始时:

$(xml).find('Properties').each(function(){
  //not sure how to get the ones I want, use an indexer?
});

5 个答案:

答案 0 :(得分:4)

这样的东西
var title;
var jobTitle;

$('Property Name', 'Properties').each(function() {

  var $this = $(this);
  if ($this.text() === "TITLE") {
    title = $this.nextAll("Value").text();
  }
  if ($this.text() === "JOBTITLE") {
    jobTitle = $this.nextAll("Value").text();
  }

});

return {
            "title" : title,
            "jobTitle" : jobTitle
       }

这是您的XML的 Working Demo

修改

如评论中所述,我假设XML是文档的一部分。如果XML不是文档的一部分,则更改以下行

$('Property Name', 'Properties').each(function() { ...

$('Property Name', xml).each(function() {

其中xml是服务xml响应。

答案 1 :(得分:3)

这些教程看起来不错:jQuery and XML revisitedReading XML with jQuery

如果您能够将数据作为JSON(JavaScript Object Notation)获取,那么在JavaScript中使用/操作数据会更容易。您可能会看到性能提升,具体取决于数据量。

答案 2 :(得分:2)

请尝试以下代码。

Working Demo →

  <script>

    var xml = '<ResponsePacket xmlns="urn:Microsoft.Search.Response">  <Response domain="QDomain">  <Range>  <StartAt>1</StartAt>   <Count>1</Count>   <TotalAvailable>1</TotalAvailable>   <Results>  <Document xmlns="urn:Microsoft.Search.Response.Document">  <Action>  <LinkUrl fileExt="aspx">https://mysite.domain.inc:443/Person.aspx?guid=4A4F27E2 9C99 4866 BB08 DE494475A4E7</LinkUrl>   </Action>  <Properties xmlns="urn:Microsoft.Search.Response.Document.Document">  <Property>  <Name>TITLE</Name>   <Type>String</Type>   <Value>Smith, Joseph</Value>   </Property>  <Property>  <Name>RANK</Name>   <Type>Int64</Type>   <Value>873</Value>   </Property>  <Property>  <Name>SIZE</Name>   <Type>Int64</Type>   <Value>0</Value>   </Property>  <Property>  <Name>DESCRIPTION</Name>   <Type>String</Type>   <Value>Hi guys!</Value>   </Property>  <Property>  <Name>WRITE</Name>   <Type>DateTime</Type>   <Value>2009 07 31T03:00:24 04:00</Value>   </Property>  <Property>  <Name>PATH</Name>   <Type>String</Type>   <Value>https://mysite.domain.inc:443/Person.aspx?guid=4A4F27E2 9C99 4866 BB08 DE494475A4E7</Value>   </Property>  <Property>  <Name>JOBTITLE</Name>   <Type>String</Type>   <Value>Programmer</Value>   </Property>  </Properties>  </Document>  </Results>  </Range>  <Status>SUCCESS</Status>   </Response>  </ResponsePacket>';

    $(document).ready(
        function()
        {
            var title, jobTitle;
            $(xml).find('Property > Name').each(
                function()
                {
                    $name = $(this);
                    if($name.text() === 'TITLE')
                        title = $name.parent().find('value').text();

                    if($name.text() === 'JOBTITLE')
                        jobTitle = $name.parent().find('value').text(); 
                }
             );

             alert(title);
             alert(jobTitle);
        }
    );

  </script>

答案 3 :(得分:1)

我非常接近于使用纯粹的选择器 - $(xml).find("Name:contains(TITLE)").nextAll("Value").text(),但是因为你想要头衔和作业标题,它就破了。

无论如何,我认为我会把我的解决方案放在那里,因为它有点不同 - 主要的想法是,如果获得任何密钥只有1。

function getValue(children, key) {
  var ret;
  children.find("Name").each(function() {
    if($(this).text() == key) {
      ret = $(this).nextAll("Value").text();
      return;
    }
  });
  return ret;
}

var children = $(xml).find("Property");
var name = getValue(children, "TITLE");
var jobTitle = getValue(children, "JOBTITLE");

答案 4 :(得分:0)

是否有一个选项允许您将项目取回JSON而不是?