代码之家  ›  专栏  ›  技术社区  ›  Ta01

用jquery解析XML

  •  3
  • Ta01  · 技术社区  · 15 年前

    我正在查询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获取标题,即Smith、Joseph和JobTitle,即程序员。

    我从以下开始:

    $(xml).find('Properties').each(function(){
      //not sure how to get the ones I want, use an indexer?
    });
    
    5 回复  |  直到 15 年前
        1
  •  4
  •   Russ Cam    15 年前

    类似的东西

    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
           }
    

    这里有一个 Working Demo 使用XML。

    编辑:

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

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

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

    哪里 xml 是服务XML响应。

        2
  •  3
  •   cllpse    15 年前

    这些教程似乎不错: jQuery and XML revisited ,请 Reading XML with jQuery .

    如果您能够以JSON(javascript对象表示法)的形式获取数据,那么在javascript中使用/操作数据就更容易了。您可能会看到性能提高,这取决于数据量。

        3
  •  2
  •   SolutionYogi Eric Lippert    15 年前

    尝试以下代码。

    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>
    
        4
  •  1
  •   Andy Gaskell    15 年前

    我很快就要用纯选择器了- $(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");
    
        5
  •  0
  •   Neil Barnwell    15 年前

    有没有一个选项可以让你把物品作为 JSON 相反?