2009-09-01 5 views
3

Я запрашиваю службу поиска Microsoft Office SharePoint Server для записи некоторых результатов в веб-часть. У меня корректный запрос, но у меня возникли проблемы с анализом ответа xml через JQuery.Анализ XML с помощью JQuery

Ниже приводится ответ 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> 

Я пытаюсь получить TITLE, т.е. Смит, Джозеф и JOBTITLE Программист с помощью т.е. JQuery.

Я начал с:

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

ответ

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 
     } 

Вот Working Demo с XML.

EDIT:

Как было отмечено в комментариях, я сделал предположение, что XML является частью документа. Если XML не является частью документа, а затем измените следующую строку

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

в

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

где xml является ответом службы XML.

+0

Вы можете добавить, что этот код предполагает, что XML является частью документа. Если нет, вам нужно будет сделать $ (xml), чтобы этот код работал. – SolutionYogi

+0

спасибо. Будет обновлено сейчас –

0

Есть вариант, который позволяет получить детали назад как JSON вместо этого?

+0

Не то, что я знаю, они являются встроенным поиском, старые веб-служба ASMX стиля, построенная в Sharepoint – kd7

3

Эти обучающие программы выглядят хорошо: jQuery and XML revisited, Reading XML with jQuery.

Если вы можете получить данные в виде JSON (JavaScript Object Notation), вам будет проще использовать/управлять вашими данными в JavaScript. И вы можете увидеть прирост производительности, в зависимости от объема данных.

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"); 
Смежные вопросы