Преобразование карты сайта в список адресов для siege

Использование XSL-преобразований для перевода XML в текст

Siege — утилита для нагрузочного тестирования web-серверов, целью которой является дать разработчикам возможность проверить быстродействие/ресурсоёмкость кода в условиях, максимально приближенных к реальным.

В режимах регрессионного тестирования и «имитации Internet» siege использует текстовый файл со списком адресов для тестирования.

В качестве такого файла очень удобно было бы использовать карту сайта (sitemap), но, к сожалению, siege не понимает . В данной статье рассмотрено одно из возможных решений по преобразованию карты сайта из в текстовый формат.

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

Самый надёжный способ — использование «родных» для XML -преобразований. В отличие от регулярных выражений -преобразования будут правильно работать даже в том случае, если используется расширенный формат карты (с элементами из других пространств имён).

Для преобразования понадобится данный XSL-файл:

[-]
Download sitemap2txt.xml
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:x="http://www.sitemaps.org/schemas/sitemap/0.9">
    <xsl:output method="text" media-type="text-plain" indent="no"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="/x:urlset/x:url">
        <xsl:value-of select="x:loc" disable-output-escaping="yes"/>
        <xsl:text>&#x000A;</xsl:text>
    </xsl:template>
</xsl:stylesheet>

Элемент <xsl:output> задаёт формат результата (обычный текст), <xsl:strip-space elements="*"/> указывает, что у всех элементов нужно удалять лишние пробельные символы, а секция <xsl:template/> делает выборку по всем блокам <url> и собирает значения элементов <loc>, добавляя новую строку (<xsl:text>&#x000A;</xsl:text>) после каждого адреса.

Загружаем файл и натравливаем xsltproc на сайтмап (например, sitemap.xml):

[-]
View Code Bash
xsltproc sitemap2txt.xml sitemap.xml -o urls.txt

Вуаля, список готов. Важно, чтобы карта сайта не содержала директив <?xml-stylesheet ?>.

Помимо XSL-преобразований есть еще способ с использованием потокового редактора sed, но способ достаточно хрупкий. Представляет собой типичный пример использования чёрной магии.

[-]
Download sitemap2list.sh
#! /bin/sh

sed -r 's/<loc/\n<loc/g; s!</loc>!</loc>\n!g' $1 | sed -r -n '/<loc>.*?<\/loc>/! D; /<loc>.*?<\/loc>/ s!</?loc>!!g; s!\s+!!g; P'

Работает эта магия следующим образом: перед всеми открывающими тэгами и после всех закрывающих тэгов </loc> добавляется символ новой строки — это делается для того, чтобы все адреса гарантированно располагались на разных строках. Результат отдаётся второму sed, работающему в «бесшумном» режиме. Удаляется всё, что не находится внутри тэгов <loc></loc>, затем удаляются сами тэги <loc> и, наконец, удаляются лишние пробелы и выводится результат.

Работает так:

[-]
View Code Bash
sitemap2list.sh sitemap.xml > list.txt

Не будет работать, если пространство имён по умолчанию не http://www.sitemaps.org/schemas/sitemap/0.9, а также если блок <loc></loc> располагается на нескольких строках. XSLT всё-таки лучше.

Автор: ; опубликовано в: Linux; метки: Linux, XML, XSL
11
Дек
2009

RSS Комментарии к статье «Преобразование карты сайта в список адресов для siege» (6)  »

  1. [...] тестирования осталась прежней: карта сайта преобразовывалась в список адресов, на этот список натравливался siege, а я присматривал за [...]

  2. [...] и в другом похожем случае, на помощь приходит преобразование [...]

  3. Прочитал этот пост и про карту, весьма удобное решение. Даже и не догадывался, что под рукой такая удобная команда)) Вот еще бы какое-нить красивое решение, как бить эти ссылки для карты по N штук на страницу

    • Можно, просто шагов будет больше.

      [-]
      View Code Bash
      xsltproc -o urls.txt sitemap2txt.xsl sitemap.xml
      split -d -l 100 urls.txt map
      for i in `ls map*`; do
          awk '
          BEGIN {
              print "<?xml version=\"1.0\"?>\
      <urlset\
          xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\
          xsi:schemaLocation=\"http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd\"\
          xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">"
          }
          {
              print "<url><loc>"$1"</loc></url>"
          }
          END {
              print "</urlset>"
          }
          '
      $i > site$i.xml
          xsltproc -o site$i.html sitemap2html.xsl site$i.xml
      done

      rm map* sitemap?*.xml urls.txt
  4. [...] из статьи «Преобразование карты сайта в список адресов для siege» [...]

  5. На awk, шикарно :)
    Спасибо, весьма полезная штукенция

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

Оставить комментарий к записи «Преобразование карты сайта в список адресов для siege»

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя

गते गते पारगते पारसंगते बोधि स्वाहा