【问题标题】:Reading line containing multiple XML tags读取包含多个 XML 标记的行
【发布时间】:2014-04-27 19:22:50
【问题描述】:

我有一个文本文件,其中包含在单行中带有多个 xml 标记的行。下面是它的示例(为清楚起见,添加了返回和间距)。

xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="1397133927.05244" TimeStamp="2014-04-10T07:45:27.00-05:00" Target="Production" Version="1.002" PrimaryLangID="en-us"><POS><Source><RequestorID Type="18" ID="HILTON"/></Source></POS><AvailStatusMessages ChainCode="ES" BrandCode="ES" HotelCode="41914">
  <AvailStatusMessage><StatusApplicationControl Start="2014-04-20" End="2014-04-26" Sun="1" InvCodeApplication="InvCode" InvCode="U1K" RatePlanCodeType="RatePlanCode" RatePlanCode="EXL" RateTier="8" IsRoom="1" Override="1"/><LengthsOfStay ArrivalDateBased="1" FixedPatternLength="2"><LengthOfStay Time="1" TimeUnit="Day" MinMaxMessageType="FullPatternLOS"/></LengthsOfStay></AvailStatusMessage>
  <AvailStatusMessage><StatusApplicationControl Start="2014-04-20" End="2014-04-26" Mon="1" Tue="1" Weds="1" Thur="1" Fri="1" Sat="1" InvCodeApplication="InvCode" InvCode="U1K" RatePlanCodeType="RatePlanCode" RatePlanCode="EXL" RateTier="8" IsRoom="1" Override="1"/><LengthsOfStay ArrivalDateBased="1" FixedPatternLength="1"></LengthsOfStay></AvailStatusMessage>
  <AvailStatusMessage><StatusApplicationControl Start="2014-04-27" End="2014-05-21" Sun="1" Mon="1" Tue="1" Weds="1" Thur="1" Fri="1" Sat="1" InvCodeApplication="InvCode" InvCode="U1K" RatePlanCodeType="RatePlanCode" RatePlanCode="EXL" RateTier="8" IsRoom="1" Override="1"/><LengthsOfStay ArrivalDateBased="1"

我有标签,其中包含具有 StatusApplicationControl Start 值的字段。我想获取所有具有 StatusApplicationControl 起始值为“2014-04-27”的 AvailStatusMessage 标签。

请帮助我使用 perl 或 shell 脚本完成这项工作。

提前致谢。

【问题讨论】:

  • 在您的示例 XML 代码中,AvailStatusMessage 标记似乎为空?那么对于这一行,你想得到一个空字符串吗?
  • 这就是availstatusmessage标签的样子(我在上面的评论中粘贴了这个),单行包含多个这样的标签。
  • 好的..我会看看的。

标签: perl shell


【解决方案1】:

你可以试试下面的代码:

#! /usr/bin/perl

use v5.12;
use File::Slurp;

my $txt=read_file('file');

while ($txt=~m{<AvailStatusMessage>(.*?)</AvailStatusMessage>}gms) {
    my $atxt=$1;
    if ($atxt=~m{<StatusApplicationControl (.*?)/>}ms) {
        my $tmp=$1;
        if ($tmp=~m{Start="2014-04-27"}ms) {
            say $atxt;
        }
    }
}

【讨论】:

  • Hakon,这可能不起作用..因为我有包含文本和 xml 消息的文本文件。它不是一个完整的xml文件
  • 好的,你能把你的文件粘贴到 pastebin.com 上,我去看看吗?
  • 这是我得到的错误,“您似乎在文件名 (*XML::Parser::FILE) 上使用了 parse 方法,您可能想要 parsefile 而不是”
  • @RohitPant 我已经更新了我的答案。你能检查一下它现在看起来更好吗?
  • @RohitPant:这是一条 SOAP 消息。如果您说“这是一条 SOAP 消息”,那会很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多