2009-09-01 31 views
3

一部の結果をWebパーツに書き込むために、Microsoft Office SharePoint Server Search Serviceにクエリを実行しています。私は正しくクエリが動作しているが、JQuery経由でXMLレスポンスを解析する際に問題が発生しています。以下はJQueryを使用したXMLの解析

は私がTITLEすなわちスミス、ジョセフとjQueryを使用してJOBTITLEすなわちプログラマーを取得しようとしている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> 

です。

は、私が使用を開始:

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

答えて

4

何かがここにあなたのXMLとWorking Demoです。

EDIT:コメントで指摘したように

、私は、XML文書の一部であるという仮定をしました。 XMLは文書の一部ではない場合は、xmlは、サービスのXML応答である

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

に次の行

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

を変更。

+0

作り付けの検索、Sharepointのに組み込まれた古いASMXスタイルのWebサービスです。そうでない場合は、このコードを動作させるために$(xml)を実行する必要があります。ありがとう。 – SolutionYogi

+0

今更新する –

0

は、あなたが戻って代わりJSONなどのアイテムを取得することができますオプションがありますか?

+0

ない、これらはあなたがこのコードは、XML文書の一部であることを前提としていることを追加したい場合があります – kd7

3

これらのチュートリアルはうまくいくようです:jQuery and XML revisitedReading XML with jQuery

JSON(JavaScript Object Notation)としてデータを取得できる場合は、JavaScriptでデータを使用/操作する方が簡単です。また、データの量に応じて、パフォーマンスが向上する可能性があります。

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 
     } 

よう

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> 
1

私は、純粋なセレクタでそれを得るために非常に近くに来た - $(xml).find("Name:contains(TITLE)").nextAll("Value").text()ができますが、タイトルを望んでいたし、それが壊れたjobtitleので。

とにかく、私は少し違うので、私はそこに私の解決策を投げるだろう - 主なアイデアは、キーを取得する場合は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");