Преобразование карты сайта в список адресов для siege
Использование XSL-преобразований для перевода XML в текст
Siege — утилита для нагрузочного тестирования web-серверов, целью которой является дать разработчикам возможность проверить быстродействие/ресурсоёмкость кода в условиях, максимально приближенных к реальным.
В режимах регрессионного тестирования и «имитации Internet» siege использует текстовый файл со списком адресов для тестирования.
В качестве такого файла очень удобно было бы использовать карту сайта (sitemap), но, к сожалению, siege не понимает XML. В данной статье рассмотрено одно из возможных решений по преобразованию карты сайта из XML в текстовый формат.
Как уже было отмечено, карта сайта представляет собой XML-файл, формат которого подробно описан здесь. Задача заключается в преобразовании XML-файла в текстовый формат (каждый адрес в отдельной строке и без лишних пробелов).
Самый надёжный способ — использование «родных» для XML XSL-преобразований. В отличие от регулярных выражений XSL-преобразования будут правильно работать даже в том случае, если используется расширенный формат карты (с элементами из других пространств имён).
Для преобразования понадобится данный XSL-файл:
<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>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
Элемент <xsl:output> задаёт формат результата (обычный текст), <xsl:strip-space elements="*"/> указывает, что у всех элементов нужно удалять лишние пробельные символы, а секция <xsl:template/> делает выборку по всем блокам <url> и собирает значения элементов <loc>, добавляя новую строку (<xsl:text>
</xsl:text>) после каждого адреса.
Загружаем файл и натравливаем xsltproc на сайтмап (например, sitemap.xml):
Вуаля, список готов. Важно, чтобы карта сайта не содержала директив <?xml-stylesheet ?>.
Помимо XSL-преобразований есть еще способ с использованием потокового редактора sed, но способ достаточно хрупкий. Представляет собой типичный пример использования чёрной магии.
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> и, наконец, удаляются лишние пробелы и выводится результат.
Работает так:
Не будет работать, если пространство имён по умолчанию не http://www.sitemaps.org/schemas/sitemap/0.9, а также если блок <loc>…</loc> располагается на нескольких строках. XSLT всё-таки лучше.
Дек
2009
Комментарии к статье «Преобразование карты сайта в список адресов для siege» (6) »
Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.
Оставить комментарий к записи «Преобразование карты сайта в список адресов для siege»
गते गते पारगते पारसंगते बोधि स्वाहा
Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.


[...] тестирования осталась прежней: карта сайта преобразовывалась в список адресов, на этот список натравливался siege, а я присматривал за [...]
[...] и в другом похожем случае, на помощь приходит преобразование [...]
Прочитал этот пост и про карту, весьма удобное решение. Даже и не догадывался, что под рукой такая удобная команда)) Вот еще бы какое-нить красивое решение, как бить эти ссылки для карты по N штук на страницу
Можно, просто шагов будет больше.
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
[...] из статьи «Преобразование карты сайта в список адресов для siege» [...]
На awk, шикарно
Спасибо, весьма полезная штукенция