Русские документы
Ежедневные компьютерные новости RSS rusdoc.ru  Найти :
http://www.rusdoc.ru. Версия для печати.

Работаем с XML в командной строке

Раздел: Programming / XML @ 01.04.2009 | Ключевые слова: xml командная строка

Автор: kurokikaze
Источник: habrahabr

Недавно нашёл замечательный инструмент для работы с XML: XMLStarlet.

Возможности:

  • Запросы XPath
  • Автоматическое создание XSLT
  • Редактирование XML (добавление-удаление узлов)
  • Преобразование XML с помощью XSLT
  • Перекодировка (UTF-8, cp1251, etc.)
  • Валидация (well-formedness, schema, DTD)
  • Форматирование XML
  • Cоединиение нескольких XML-документов
  • Работа с XML по протоколу HTTP/FTP


Примеры использования:

XMLstarlet вызывается из командной строки.

Получить структуру элементов XML (ключ -u выводит только уникальные элементы):

>xml el -u translated.wiki.xml


mediawiki
mediawiki/page
mediawiki/page/id
mediawiki/page/restrictions
mediawiki/page/revision
mediawiki/page/revision/comment
mediawiki/page/revision/contributor
mediawiki/page/revision/contributor/id
mediawiki/page/revision/contributor/ip
mediawiki/page/revision/contributor/username
mediawiki/page/revision/id
mediawiki/page/revision/minor
mediawiki/page/revision/text
mediawiki/page/revision/timestamp
mediawiki/page/title
mediawiki/siteinfo
mediawiki/siteinfo/base
mediawiki/siteinfo/case
mediawiki/siteinfo/generator
mediawiki/siteinfo/namespaces
mediawiki/siteinfo/namespaces/namespace
mediawiki/siteinfo/sitename


Перекодировать XML в cp1251:

>xml fo -e cp1251 habrahabr.rss.xml > habrahabr-1251.rss.xml


Выборка элементов:

>xml sel -T -t -m "/rss/channel/item" -v «author» -o ": " -v «category» -o " / " -v «title» -n habrahabr-1251.rss.xml


habriel: хабраинтервью / Хабраинтервью / Вопросы Хокону Ли, Йону Хиксу и Молли Хольцшлаг (Opera Software)
alizar: Last.fm / Социальные сети / Last.fm отложил платную подписку
_meowth_: программирование / Программинг микроконтроллеров / Пишем ОС сами
MissUFO: wss 3.0 / Microsoft SharePoint / Разгоняем Sharepoint до скорости Highload интернет сайта
serkys: стартапы / Я пиарюсь / TV Episodes итоги второй недели
gagin: телевидение / Я пиарюсь / Энциклопедия телевидения Vokrug.tv
alizar: Windows 7 / Windows 7 / Коробки Windows 7 — победителям конкурса
powerlexis: плакаты / Презентации. Практика и теория. / Советские слайды
badlittleduck: события / Байнет / Календарь ИТ-событий Беларуси. Жаркая весна
Took: gmail / Google / Gmail — Labs в русском интерфейсе!
green_mouse: ruby / Ruby / PODCAST Ruby NoName Podcast #4
XaocCPS: microsoft research / Разработка / Новый взгляд на навигацию по коду
badlittleduck: юзабилити-тестирование / Эти пользовательские интерфейсы / Изображение человеческого лица притягивает взгляд. Результаты eye-tracking исследования
vedensky: hh.ru / Интернет-реклама и кризис / Еще одна примета времени
Lachezis: php / PHP / Простое сравнение изображений с помощью php
miami: mysql / MySQL / Ускоряем выборку произвольных записей MySQL
Tigger: hp / Блог компании Hewlett-Packard / Новые вакансии для студентов-стажеров
Shoohurt: яндекс / Огненный лис / Глава Mozilla Foundation в Москве
akira: pictures / Я пиарюсь / Pict.com — новая версия хостинга изображений.
bur: Javascript / Javascript / Range, TextRange и Selection
Mordatyj: DesignworksUSA / Гаджеты. Устройства для гиков / Геймерский корпус Level 10
Mordatyj: TIE Fighter / Гаджеты. Устройства для гиков / Вебкамера TIE Fighter
alizar: Марс-500 / Научно-популярное / Второй этап эксперимента «Марс-500» стартует завтра
AntonShcherbinin: regex / Регулярные выражения / Сверхжадные квантификаторы
lesnikova: дизайн / Блог компании RMA / Самый аппетитный веб-дизайн
rssbot: / Блог компании Яндекс / RSS-пост Новый виджет: Яндекс.Погода
alizar: Джим Кейзер / Peer-to-Peer / Хакеры начали охоту за следователем по делу Pirate Bay
stepan_ovchinnikov: gmail / Google / Воруют пароли от гуглопочты?
aparatos: стартап / Стартапы / Персональный Издательский Дом. Или как создать глянцевый журнал своей мечты
Mordatyj: трекбол / Гаджеты. Устройства для гиков / «Нанотрекбол» от Evergreen
simanyay: pycon / Язык программирования Python / Ссылка Краткий отчет о прошедшей конференции PyCon `09
gorbarsky: skype / Skype / Skype for iPhone – первые скриншоты
Radeon: wimax / WiMAX: сеть поколения 4G / Максимальное испытание ваймакса Yota. Потоковое видео в дороге!
Shapelez: Twitter / Twitter / В школьном расписании
Shapelez: Sun / Sun Microsystems / Интернет в контейнере
r3code: многоуровневое дерево / Каскадные Таблицы Стилей / Многоуровневое дерево с маркерами (только HTML, CSS, без Javascript)
medgimet: Google.ua / Google / Ссылка Google отсудил домен Google.ua!
ilnovikov: веб 2.0 / Подкасты / PODCAST PodШтучки #72
zonda: nfs / Игры / Need for Speed SHIFT Teaser
gaidar: microsoft / Microsoft / Вопросы для интервью с Program Manager в подразделении Connected Systems Евгением Осоветским


Указав вместо ключа -T (текстовый вывод) ключ -C, мы получим готовый файл XSLT:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.rusdoc.ru/go.php?http://www.w3.org/1999/XSL/Transform"
xmlns:exslt="http://www.rusdoc.ru/go.php?http://exslt.org/common"
xmlns:math="http://www.rusdoc.ru/go.php?http://exslt.org/math"
xmlns:date="http://www.rusdoc.ru/go.php?http://exslt.org/dates-and-times"
xmlns:func="http://www.rusdoc.ru/go.php?http://exslt.org/functions"
xmlns:set="http://www.rusdoc.ru/go.php?http://exslt.org/sets"
xmlns:str="http://www.rusdoc.ru/go.php?http://exslt.org/strings"
xmlns:dyn="http://www.rusdoc.ru/go.php?http://exslt.org/dynamic"
xmlns:saxon="http://www.rusdoc.ru/go.php?http://icl.com/saxon"
xmlns:xalanredirect="org.apache.xalan.xslt.extensions.Redirect"
xmlns:xt="http://www.rusdoc.ru/go.php?http://www.jclark.com/xt"
xmlns:libxslt="http://www.rusdoc.ru/go.php?http://xmlsoft.org/XSLT/namespace"
xmlns:test="http://www.rusdoc.ru/go.php?http://xmlsoft.org/XSLT/"
extension-element-prefixes="exslt math date func set str dyn saxon xalanredirect xt libxslt test"
exclude-result-prefixes="math str">
<xsl:output omit-xml-declaration="yes" indent="no"/>
<xsl:param name="inputFile">-</xsl:param>
<xsl:template match="/">
<xsl:call-template name="t1"/>
</xsl:template>
<xsl:template name="t1">
<xsl:for-each select="/rss/channel/item">
<xsl:value-of select="author"/>
<xsl:value-of select="`: `"/>
<xsl:value-of select="category"/>
<xsl:value-of select="` / `"/>
<xsl:value-of select="title"/>
<xsl:value-of select="` `"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>


Посчитать количество элементов (XPath):

>xml sel -T -t -m "/rss/channel" -v «count(item)» habrahabr.rss.xml


40

Linux-версия отличается возможностью работать с файлами по HTTP/FTP, то есть можно писать сразу xml sel -T -t -m "/rss/channel/item" -v "author" -o ": " -v "category" -o " / " -v "title" -n habrahabr.ru/rss/.

XMLStarlet входит в некоторые дистрибутивы Linux (в Debian точно есть), версию для Windows можно скачать с SourceForge.



Вернуться в раздел: Programming / XML
© Copyright 1998-2012 Александр Томов. All rights reserved.