Используйте 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 & 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 & 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 & 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, ваше регулярное выражение может однажды расплыться загадочно.
1. Не разбирайте XML с 'sed' или' awk'. 2. Мы не можем предоставить вам примеры кода для запуска, не видя XML, который содержит данные, которые вы хотите получить. 3. Не разбирайте XML с помощью 'sed' или' awk'. 4. Пожалуйста, [обновите свой вопрос] (http://unix.stackexchange.com/posts/216842/edit), чтобы предоставить минимальный пример XML-файла. 5. Не разбирайте XML с 'sed' или' awk'. – roaima
Я отформатировал ваш вопрос, и теперь XML отображается. К сожалению, ваш пример не является допустимым XML-документом. – roaima
Вам нужно отформатировать содержимое. В этом случае это означает использование маркера '{}' для отступов содержимого на четыре пробела. Я сделаю это для вас еще раз ... – roaima