xml - 如何使用正则表达式操作来自 SOAP XML 的数据

标签 xml linux perl curl soap

我打算编写一个通过 SOAP 获取数据的脚本。我可以获得一个包含大量以下数据的文件,例如:

 <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><ns0:GetList_Operation_0Response xmlns:ns0="urn:TEST:AST:Attributes" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns0:getListValues>
        <ns0:AssetLifecycleStatus>Deployed</ns0:AssetLifecycleStatus>
        <ns0:ReconciliationIdentity>OI-ASDAQWDASDWA</ns0:ReconciliationIdentity>
        <ns0:instanceId>OI-SDWDSDWDSDWD</ns0:instanceId>
        <ns0:ModifiedDate>2017-12-12T03:31:32+01:00</ns0:ModifiedDate>
        <ns0:ClassId>BMC_COMPUTERSYSTEM</ns0:ClassId>
    </ns0:getListValues>
    <ns0:getListValues>
        <ns0:AssetLifecycleStatus>Being Assembled</ns0:AssetLifecycleStatus>
        <ns0:ReconciliationIdentity>OI-ASDQWAWDSADW</ns0:ReconciliationIdentity>
        <ns0:instanceId>OI-SDWDSWDSWDWD</ns0:instanceId>
        <ns0:ModifiedDate>2017-12-10T03:30:21+01:00</ns0:ModifiedDate>
        <ns0:ClassId>BMC_COMPUTERSYSTEM</ns0:ClassId>
    </ns0:getListValues>
    <ns0:getListValues>
        <ns0:AssetLifecycleStatus>Deployed</ns0:AssetLifecycleStatus>
        <ns0:ReconciliationIdentity>OI-ASDWASDWDASDW</ns0:ReconciliationIdentity>
        <ns0:instanceId>OI-SDWDSDWDSDWD</ns0:instanceId>
        <ns0:ModifiedDate>2017-12-12T03:31:31+01:00</ns0:ModifiedDate>
        <ns0:ClassId>BMC_COMPUTERSYSTEM</ns0:ClassId>
    </ns0:getListValues>
</ns0:GetList_Operation_0Response></soapenv:Body></soapenv:Envelope>

您能否建议如何仅提取“AssetLifecycleStatus”之间的状态,例如:已部署。它应该遍历这一行的每一部分并将输出提供给新的一行。示例:

已部署

正在组装

已部署

哪种语言是处理此类数据的最佳语言,是 Perl 吗? 感谢您的信息!

最佳答案

确实没有一种解析 XML 的最佳语言。 Perl 以其正则表达式而闻名,但解析 XML 最好使用专用解析器来完成。在 perl 中,XML::LibXML 是被广泛使用的一种。还有其他针对 Perl 的解析器,以及 Python、Ruby、JS 等。

#!/usr/bin/perl
use strict;
use warnings;
use XML::LibXML;

my $doc = XML::LibXML->load_xml(IO => *DATA);
    # can also load with (string => $xml_string) or (location => 'file.xml');
my @nodes = $doc->getElementsByTagName('ns0:AssetLifecycleStatus');

for my $node (@nodes) {
    print $node->textContent."\n";
}


__DATA__
<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><ns0:GetList_Operation_0Response xmlns:ns0="urn:TEST:AST:Attributes" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns0:getListValues>
        <ns0:AssetLifecycleStatus>Deployed</ns0:AssetLifecycleStatus>
        <ns0:ReconciliationIdentity>OI-ASDAQWDASDWA</ns0:ReconciliationIdentity>
        <ns0:instanceId>OI-SDWDSDWDSDWD</ns0:instanceId>
        <ns0:ModifiedDate>2017-12-12T03:31:32+01:00</ns0:ModifiedDate>
        <ns0:ClassId>BMC_COMPUTERSYSTEM</ns0:ClassId>
    </ns0:getListValues>
    <ns0:getListValues>
        <ns0:AssetLifecycleStatus>Being Assembled</ns0:AssetLifecycleStatus>
        <ns0:ReconciliationIdentity>OI-ASDQWAWDSADW</ns0:ReconciliationIdentity>
        <ns0:instanceId>OI-SDWDSWDSWDWD</ns0:instanceId>
        <ns0:ModifiedDate>2017-12-10T03:30:21+01:00</ns0:ModifiedDate>
        <ns0:ClassId>BMC_COMPUTERSYSTEM</ns0:ClassId>
    </ns0:getListValues>
    <ns0:getListValues>
        <ns0:AssetLifecycleStatus>Deployed</ns0:AssetLifecycleStatus>
        <ns0:ReconciliationIdentity>OI-ASDWASDWDASDW</ns0:ReconciliationIdentity>
        <ns0:instanceId>OI-SDWDSDWDSDWD</ns0:instanceId>
        <ns0:ModifiedDate>2017-12-12T03:31:31+01:00</ns0:ModifiedDate>
        <ns0:ClassId>BMC_COMPUTERSYSTEM</ns0:ClassId>
    </ns0:getListValues>
</ns0:GetList_Operation_0Response></soapenv:Body></soapenv:Envelope>

关于xml - 如何使用正则表达式操作来自 SOAP XML 的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47924918/

相关文章:

php - 在 <loc> 标记、站点地图索引文件中包含查询的 URL

linux - 可以通过 apache 服务器流式传输或收听来自麦克风的实时音频吗?

linux - 无法将 UTF-16 设置为语言环境

java - 删除少量节点的 XQuery

android - 缩放 XML 中的可绘制资源 (Android)

linux - fio benchmark 延迟说明

php - 如何从 Linux 上的日志文件中提取 XML block

perl - Perl 中 BEGIN block 的作用是什么?

Java 相当于 Perl 的 s///运算符?

xml - 如何使用 xsi :type in XSD? 限制 XML 元素的值