2015-07-17 2 views
0

Как разобрать XML с содержимым ниже?Анализ XML с использованием командной строки

<?xml version="1.0"?> 
<saw:ibot xmlns:saw="com.siebel.analytics.web/report/v1" version="1" priority="normal" jobID="36                  "> 
    <saw:schedule timeZoneId="(GMT-05:00) Eastern Time (US &amp; Canada)" disabled="false"> 
    <saw:start repeatMinuteInterval="60" endTime="23:59:00" startImmediately="true"/> 
    <saw:recurrence runOnce="false"> 
     <saw:weekly weekInterval="1" mon="true" tue="true" wed="true" thu="true" fri="true"/> 
    </saw:recurrence> 
    </saw:schedule> 
    <saw:dataVisibility type="recipient" runAs="cgm"/> 
    <saw:choose> 
    <saw:when condition="true"> 
     <saw:deliveryContent> 
     <saw:headline> 
      <saw:caption> 
      <saw:text>Availability Parity Alert for Next 14 Days (@{NQ_SESSION.LBL_Next_14_Arriv                  al_Days})</saw:text> 
      </saw:caption> 
     </saw:headline> 
     <saw:conditionalReport/> 
     </saw:deliveryContent> 
     <saw:postActions/> 
    </saw:when> 
...skipping... 
al_Days})</saw:text> 
      </saw:caption> 
     </saw:headline> 
     <saw:conditionalReport/> 
     </saw:deliveryContent> 
     <saw:postActions/> 
    </saw:when> 
    <saw:otherwise/> 
    </saw:choose> 
    <saw:deliveryDestinations> 
    <saw:destination category="dashboard"/> 
    <saw:destination category="activeDeliveryProfile"/> 
    </saw:deliveryDestinations> 
    <saw:recipients subscribers="true" customize="false" specificRecipients="false"> 
    <saw:subscribers> 
     <saw:user name="[email protected]"/> 
     <saw:user name="[email protected]"/> 
     <saw:user name="[email protected]"/> 
    </saw:subscribers> 
    </saw:recipients> 
    <saw:conditionQuery> 
    <saw:reportRefNode path="/shared/Quote/Product/Alerts/Daily Availability Parity Alert - Next                   14 Days - Content"/> 
    </saw:conditionQuery> 
</saw:ibot> 

и получить ниже выход?

[email protected] 
[email protected] 
[email protected] 

Также у меня есть 5 .xml-файл с различным набором значений имени синтаксического анализа. В любом случае мы можем разбирать и объединять их в командной строке и выводить в один файл?

Я пробовал sed и awk вариантов, но не помог мне получить желаемый результат.

+5

1. Не разбирайте XML с 'sed' или' awk'. 2. Мы не можем предоставить вам примеры кода для запуска, не видя XML, который содержит данные, которые вы хотите получить. 3. Не разбирайте XML с помощью 'sed' или' awk'. 4. Пожалуйста, [обновите свой вопрос] (http://unix.stackexchange.com/posts/216842/edit), чтобы предоставить минимальный пример XML-файла. 5. Не разбирайте XML с 'sed' или' awk'. – roaima

+0

Я отформатировал ваш вопрос, и теперь XML отображается. К сожалению, ваш пример не является допустимым XML-документом. – roaima

+0

Вам нужно отформатировать содержимое. В этом случае это означает использование маркера '{}' для отступов содержимого на четыре пробела. Я сделаю это для вас еще раз ... – roaima

ответ

3

Эта команда будет разобрать ваш XML-документ и использовать XPath для извлечения значений name атрибутов для элемента на месте /saw:ibot/saw:recipients/saw:subscribers/saw:user

xmlstarlet sel -t -v '/saw:ibot/saw:recipients/saw:subscribers/saw:user/@name' </tmp/xml 

Выходной

[email protected] 
[email protected] 
[email protected] 
+1

На стороне примечания: люди также, похоже, любят [xidel] (http://www.videlibri.de/xidel.html) (сайт на данный момент, вместе с остальной частью SourceForge). – lcd047

+0

@mzjn это сработало для меня, учитывая образец XML. – roaima

+0

Хорошо, если вы так говорите. Для меня это не так, и трудно понять, как это может работать. – mzjn

1

Используйте XML Parser. Лично - как XML::Twig и perl.

#!/usr/bin/env perl 

use strict; 
use warnings; 
use XML::Twig; 

my $twig = XML::Twig->new(); 
$twig->parsefile ('your_file.xml'); 

foreach my $saw_user ($twig->get_xpath('//saw:user')) { 
    print $saw_user ->att('name'), "\n"; 
} 

Печатается:

[email protected] 
[email protected] 
[email protected] 

Если вы хотите «один вкладыш», то вместо:

perl -MXML::Twig -0777 -e 'print map { $_ -> att('name')."\n"} (XML::Twig->parse(<>)->get_xpath('//saw:user'))' your_xml_file 

Пожалуйста, ради будущих программистов по техническому обслуживанию и сисадминов - НЕ использовать регулярные выражения для анализа XML. Почему вы можете спросить? Ну, потому что с вашего XML в качестве примера - это может выглядеть, как любой из них и до сих пор семантически идентичны:

(ваш пример +

<?xml version="1.0" encoding="utf-8"?> 
<saw:ibot 
    jobID="36" 
    priority="normal" 
    version="1" 
    xmlns:saw="com.siebel.analytics.web/report/v1"> 
    <saw:schedule 
     disabled="false" 
     timeZoneId="(GMT-05:00) Eastern Time (US &amp; Canada)"> 
    <saw:start 
     endTime="23:59:00" 
     repeatMinuteInterval="60" 
     startImmediately="true" 
    /> 
    <saw:recurrence runOnce="false"> 
     <saw:weekly 
      fri="true" 
      mon="true" 
      thu="true" 
      tue="true" 
      wed="true" 
      weekInterval="1" 
     /> 
    </saw:recurrence> 
    </saw:schedule> 
    <saw:dataVisibility 
     runAs="cgm" 
     type="recipient" 
    /> 
    <saw:choose> 
    <saw:when condition="true"> 
     <saw:deliveryContent> 
     <saw:headline> 
      <saw:caption> 
      <saw:text>Availability Parity Alert for Next 14 Days (@{NQ_SESSION.LBL_Next_14_Arrival_Days})</saw:text> 
      </saw:caption> 
     </saw:headline> 
     <saw:conditionalReport/> 
     </saw:deliveryContent> 
     <saw:postActions/> 
    </saw:when> 
    <saw:otherwise/> 
    </saw:choose> 
    <saw:deliveryDestinations> 
    <saw:destination category="dashboard" /> 
    <saw:destination category="activeDeliveryProfile" /> 
    </saw:deliveryDestinations> 
    <saw:recipients 
     customize="false" 
     specificRecipients="false" 
     subscribers="true"> 
    <saw:subscribers> 
     <saw:user name="[email protected]" /> 
     <saw:user name="[email protected]" /> 
     <saw:user name="[email protected]" /> 
    </saw:subscribers> 
    </saw:recipients> 
    <saw:conditionQuery> 
    <saw:reportRefNode path="/shared/Quote/Product/Alerts/Daily Availability Parity Alert - Next 14 Days - Content" /> 
    </saw:conditionQuery> 
</saw:ibot> 

Или как это (примечание тег упаковки элементов)

<?xml version="1.0" encoding="utf-8"?> 
<saw:ibot jobID="36" priority="normal" version="1" xmlns:saw="com.siebel.analytics.web/report/v1"> 
    <saw:schedule disabled="false" timeZoneId="(GMT-05:00) Eastern Time (US &amp; Canada)"> 
    <saw:start endTime="23:59:00" repeatMinuteInterval="60" startImmediately="true"/> 
    <saw:recurrence runOnce="false"> 
     <saw:weekly fri="true" mon="true" thu="true" tue="true" wed="true" weekInterval="1"/> 
    </saw:recurrence> 
    </saw:schedule> 
    <saw:dataVisibility runAs="cgm" type="recipient"/> 
    <saw:choose> 
    <saw:when condition="true"> 
     <saw:deliveryContent> 
     <saw:headline> 
      <saw:caption> 
      <saw:text>Availability Parity Alert for Next 14 Days (@{NQ_SESSION.LBL_Next_14_Arrival_Days})</saw:text> 
      </saw:caption> 
     </saw:headline> 
     <saw:conditionalReport/> 
     </saw:deliveryContent> 
     <saw:postActions/> 
    </saw:when> 
    <saw:otherwise/> 
    </saw:choose> 
    <saw:deliveryDestinations> 
    <saw:destination category="dashboard"/> 
    <saw:destination category="activeDeliveryProfile"/> 
    </saw:deliveryDestinations> 
    <saw:recipients customize="false" specificRecipients="false" subscribers="true"> 
    <saw:subscribers> 
     <saw:user name="[email protected]"/> 
     <saw:user name="[email protected]"/> 
     <saw:user name="[email protected]"/> 
    </saw:subscribers> 
    </saw:recipients> 
    <saw:conditionQuery> 
    <saw:reportRefNode path="/shared/Quote/Product/Alerts/Daily Availability Parity Alert - Next 14 Days - Content"/> 
    </saw:conditionQuery> 
</saw:ibot> 

Или так:

<?xml version="1.0" encoding="utf-8"?> 
<saw:ibot 
jobID="36" 
priority="normal" 
version="1" 
xmlns:saw="com.siebel.analytics.web/report/v1" 
><saw:schedule 
disabled="false" 
timeZoneId="(GMT-05:00) Eastern Time (US &amp; Canada)" 
><saw:start 
endTime="23:59:00" 
repeatMinuteInterval="60" 
startImmediately="true" 
/><saw:recurrence 
runOnce="false" 
><saw:weekly 
fri="true" 
mon="true" 
thu="true" 
tue="true" 
wed="true" 
weekInterval="1" 
/></saw:recurrence></saw:schedule><saw:dataVisibility 
runAs="cgm" 
type="recipient" 
/><saw:choose 
><saw:when 
condition="true" 
><saw:deliveryContent 
><saw:headline 
><saw:caption 
><saw:text 
>Availability Parity Alert for Next 14 Days (@{NQ_SESSION.LBL_Next_14_Arrival_Days})</saw:text></saw:caption></saw:headline><saw:conditionalReport 
/></saw:deliveryContent><saw:postActions 
/></saw:when><saw:otherwise 
/></saw:choose><saw:deliveryDestinations 
><saw:destination 
category="dashboard" 
/><saw:destination 
category="activeDeliveryProfile" 
/></saw:deliveryDestinations><saw:recipients 
customize="false" 
specificRecipients="false" 
subscribers="true" 
><saw:subscribers 
><saw:user 
name="[email protected]" 
/><saw:user 
name="[email protected]" 
/><saw:user 
name="[email protected]" 
/></saw:subscribers></saw:recipients><saw:conditionQuery 
><saw:reportRefNode 
path="/shared/Quote/Product/Alerts/Daily Availability Parity Alert - Next 14 Days - Content" 
/></saw:conditionQuery></saw:ibot> 

Надеюсь, глядя на эти образцы, вы будете посмотрите, что, переформатировав свой XML в режиме PERFECTLY VALID, ваше регулярное выражение может однажды расплыться загадочно.

Смежные вопросы