Структура XML для быстрого поиска - PullRequest
2 голосов
/ 24 февраля 2012

Быстрее ли одна или другая из следующих структур, когда дело доходит до поиска определенного "ресурса" в приведенном ниже XML-файле?

Образец 1.


<root>
 <resource key="res_test_1" value="test"/>
 <resource key="res_test_2" value="test 2"/>
 <resource key="res_test_3" value="test 3"/>
</root>

Образец 2.


<root>
 <res_test_1>test</res_test_1>
 <res_test_2>test 2</res_test_2>
 <res_test_3>test 3</res_test_3>
</root>

«Ключи» - это всегда допустимые имена элементов XML.

Я спрашиваю, поскольку этот набор ключей / значений ресурса будет частью XML-файла, который будет обрабатываться XSL, заменяя определенные «ключи» в XML значениями из ресурсной части того же XML-файла. ... и я хотел бы структурировать ресурсную часть как можно более оптимально для поиска, который будет необходим. Я использую C # и объект XslCompiledTransform для запуска преобразования.

Мой чистый инстинкт говорит, что объектная модель может быстрее получить ключи, когда они являются реальными именами элементов, но я не нахожу никаких советов относительно такого рода вопроса. Возможно, не имеет значения думать об этой проблеме, так как весь документ XML будет в памяти во время преобразования.

Редактировать (добавив больше информации отсюда и вниз): Как я уже указывал, этот вопрос может быть теоретическим (фокусирование на нескольких миллисекундах не имеет значения), но причина ввода этого вопроса состояла в том, чтобы получить мнение именно о том, что я спрашиваю - один способ быстрее, чем другой (из двух приведенных примеров), когда речь идет о размещении данных в структуре XML. Является ли один или другой предпочтительным способом, по любой причине.

На мой взгляд, в первом примере требуется больше «работы» для процессора, для поиска и возврата значения при его запросе.

Это образец XPath для Образца 1: / Корень / ресурс [@ ключ = "res_test_2"] / @ значение

Соответствующий XPath для образца 2: / Корень / res_test_2

Кроме того, структура образца 2 требует меньше места, что улучшит время загрузки, как указано одним из ответов ниже. Хороший вопрос, по крайней мере, для очень больших документов.

Когда я подумаю об этом: очевидный недостаток примера 2 состоит в том, что схема XSD не будет иметь особого смысла, поскольку эта часть XML будет иметь динамические имена элементов ... что может быть тем, что советуют положить все значения в атрибуты (см. ответ ниже) было около.

Я сделал эти образцы XPath, поскольку их легко продемонстрировать. Аналогичный поиск потребуется в XSL-преобразовании, о котором я писал ранее, но в центре внимания этого вопроса должна быть структура документа, как более общий вопрос.

Спасибо, Andreas

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

Некоторое время назад я спросил кое-что о производительности XSLT и получил следующий ответ:

Использование атрибутов вместо элементов повышает производительность.При выполнении совпадений XPath атрибуты работают быстрее, потому что они свободно напечатаны.Это облегчает проверку схемы.

(см. этот вопрос )

0 голосов
/ 24 февраля 2012

Между sample1 и sample2 единственное различие заключается в том, что .. вы конвертируете элемент в атрибут. Хорошо, чтение дочернего атрибута будет стоить столько же усилий, сколько чтение дочернего элемента.1004 *

Xpath для чтения «чего-то» из первого примера - /root/child/@id/. и Xpath для чтения /root/child/id/. ..

, что не так уж и много, но если вы посмотрите наразмер .. example2 немного велик ... теперь предположим, что у вас есть огромный список таких узлов ... тогда файл example2 будет больше, чем example1 .. Итак, данные example2 имеют большой вес

возвращаясь к вашим примерам .. Если вы посмотрите на структуру .. sample1 выглядит длиннее, чем sample2 ..Предположим, что одни и те же файлы имеют огромное количество данных с соответствующей иерархией.если вы попытаетесь прочитать sample1 и sample2 с использованием кода C # ... коду потребуется больше времени для загрузки sample1 (из-за его размера) .. по сравнению с этой скоростью обработки (я имею в виду процесс чтения узлов) будет игнорироваться.

@ OP, как вы уже знаете ..

XPath for Sample 1: /root/resource[@key="res_test_2"]/@value

Corresponding XPath for Sample 2: /root/res_test_2

Sample1 определенно понижается на 1 уровень ... по сравнению с Sample2 ... но, как я упоминал ранее ... Я заметил, что это не будет иметь большого значения для анализатора, я уже объяснил об эффектахразмером более чтение файла .. Есть кое-что, что я хотел бы сообщить вам.Использование атрибутов должно быть разумным выбором, это не правило, но мы обычно используем атрибуты в качестве метаданных.Пример:

<root>
  <child id="1">some Data</child>
  <child id="2">Some other Data</child>
</root>

Если вы посмотрите на приведенный выше пример XML, attributeis, то есть «ID» используется в качестве метаданных о данных дочернего узла, Id - это не данные, это просто под-сообщение..

Возьмите другой пример:

<html>
   <body>
       <div class="style1">Here is the display text.</div>
   </body>
</html>

Приведенный выше пример - не что иное, как HTML-код :) Где атрибут Class имеет значение "style1" ... это имя класса затем используется в файле CSS для добавления свойства и стилей в текст под тегом

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