Анализируемый источник данных XML не распознает значения «0» - PullRequest
1 голос
/ 25 ноября 2010

Я использую источник данных XML в приложении. Одно из полей с именем quantity иногда равно нулю, таким образом:

<quantity>0</quantity>

Однако, когда я пытаюсь получить это значение, фактическое значение в структуре данных JSON не 0, оно просто отсутствует. Другие поля отображаются с элементом $t внутри них, но это не так:

'item' :{
  'quantity' :{},
  'name' :{'$t' : 'ItemName'}
}

Я бы хотел pick() вывести это значение и определить, является ли оно положительным числом (если оно равно нулю, я делаю что-то еще). Как я могу это сделать?

РЕДАКТИРОВАТЬ: когда есть нормальное числовое значение, XML выглядит следующим образом

<quantity>100</quantity>

и JSON выглядит так

'quantity' :{'$t' :100}

Так и должно быть.

1 Ответ

2 голосов
/ 25 ноября 2010

Я считаю, что в настоящее время это может быть ошибкой, но у меня есть способ заставить ее работать, пока она не будет исправлена.

Пример XML:

<?xml version="1.0" encoding="UTF-8"?>
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng"
    yahoo:count="0" yahoo:created="2010-11-24T18:16:40Z" yahoo:lang="en-US">
    <diagnostics>
        <user-time>858</user-time>
        <service-time>0</service-time>
        <build-version>9847</build-version>
    </diagnostics> 
    <results/>
</query>

Пример KRL:

ruleset a60x435 {
  meta {
    name "xml test"
    description <<
      testing xml node values that are 0
    >>
    author "Mike Grace"
    logging on
  }

  global {
    dataset testXml:XML <- "http://dl.dropbox.com/u/1446072/apps/test/test1.xml" cachable for 1 month;
  }

  rule getting_zero_value_from_xml_node {
    select when pageview ".*"
    pre {
      nodeValue = testXml.pick("$..service-time.$t");
      testValue = "#{nodeValue}".replace(re/(ARRAY).*/,"$1");
      nodeValue = (testValue eq "ARRAY") => 0 | nodeValue;
    }
    {
      notify("nodeValue",nodeValue) with sticky = true;
    }
  }
}

Объяснение:

  • выбрать значение узла из набора данных или источника данных
  • принудительно преобразовать переменную в строку и проверить наличие значения 'ARRAY'
  • исходной переменной в 0, если найдена строка 'ARRAY'

Когда узел XML преобразуется в JSON и имеет значение 0, он превращается в пустой хеш.На сервере переменная является указателем на хеш.Поскольку мы можем принудительно указать указатель на строку и проверить ее, мы можем обработать случай, когда значение узла равно нулю.

...