Разбор XML с JQuery - PullRequest
       44

Разбор XML с JQuery

3 голосов
/ 01 сентября 2009

Я запрашиваю службу поиска Microsoft Office SharePoint Server, чтобы записать некоторые результаты в веб-часть. У меня правильно работает запрос, но возникают проблемы с синтаксическим анализом ответа 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>

Я пытаюсь получить НАЗВАНИЕ, т. Е. Смит, Джозеф и программист JOBTITLE, т. Е. Используя JQuery.

Я начал с:

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

Ответы [ 5 ]

4 голосов
/ 01 сентября 2009

Что-то вроде

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.

EDIT:

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

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

до

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

где xml - ответ службы xml.

3 голосов
/ 01 сентября 2009

Эти руководства кажутся хорошими: Пересмотр jQuery и XML , Чтение XML с помощью jQuery .

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

2 голосов
/ 01 сентября 2009

Попробуйте следующий код.

Рабочая демоверсия & rarr;

  <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 голос
/ 01 сентября 2009

Я был очень близок к тому, чтобы получить его с чистыми селекторами - $(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");
0 голосов
/ 01 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...