Выражение XPath для возврата значения на основе значения родного брата - PullRequest
1 голос
/ 12 февраля 2010

Вот пример XML-файла, из которого я пытаюсь получить данные:

<rss>
 <channel>
  <item>
   <title>First Title</title>
   <description>description text</description>
   <component>Distribution - Maintain</component>
   <timeoriginalestimate seconds="3600">1 hour</timeoriginalestimate>
   <timespent seconds="1860">31 minutes</timespent>
  </item>
  <item>
   <title>Second Title</title>
   <description>description text</description>
   <component>Reporting - Security</component>
   <timeoriginalestimate seconds="3600">1 hour</timeoriginalestimate>
   <timespent seconds="1860">31 minutes</timespent>
  </item>
  <item>
   <title>third Title</title>
   <description>description text</description>
   <timeoriginalestimate seconds="5400">1 hour, 30 Minutes</timeoriginalestimate>
   <timespent seconds="2700">45 minutes</timespent>
  </item>
  <item>
   <title>Fourth Title</title>
   <description>description text</description>
   <component>Usability</component>
  </item>
  <item>
   <title>Fifth Title</title>
   <description>description text</description>
   <component>Distribution - Maintain</component>
   <timeoriginalestimate seconds="3600">1 hour</timeoriginalestimate>
   <timespent seconds="7200">2 hours</timespent>
  </item>
 </channel>
</rss>

Я хочу собрать узлы timeoriginalestimate и timespent по значению component. Я хочу сохранить значение component либо на карте, либо в хэше в качестве ключа, а затем значение, равное общей разнице timeoriginalestimate и timespent

K = "Распределение - Ведение" V = 2 часа-2 часа 31 минута

Некоторые из item не будут иметь component, а некоторые из component не будут иметь значений времени. В этом случае я хотел бы, чтобы значения времени просто добавлялись к промежуточному итогу для «другого» компонента.

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

Любая помощь будет высоко ценится. Спасибо!

Пример кода для подсчета вхождений значения:

private XPath featureXPath = XPath.newInstance("count(//rss/channel/item/type[text()='New Feature'])");
LinkedHashMap<String, Double> metrics = new LinkedHashMap<String, Double>();
metrics.put("New Features", (Double)featureXPath.selectSingleNode(doc));

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

1 Ответ

0 голосов
/ 13 февраля 2010

Я задаю вам два вопроса: (1) как получить строки и числа из вашего документа с помощью XPath, и (2) как обрабатывать случаи с отсутствующими данными. Мне не ясно, что вы хотите сделать с (2) отсутствующими данными. Ваш пример включает item, у которого вообще нет информации о времени, даже timespent - я не знаю, как вы хотите с этим справиться.

Код ниже обрабатывает извлечение и математику (1). Выполнение вычитания в XPath позволяет мне делать 2 вызова XPath вместо 3. Я использую немедленную оценку, чтобы выражения XPath были близки к тому, где я их использую - мне это кажется более понятным. Возможно, вы захотите извлечь их из цикла и скомпилировать их, используя xpath.compile(), чтобы не перекомпилировать их на каждой итерации, если ваше профилирование показывает значительную экономию.

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