因此,响应基本上是完整的XML文档,作为另一个XML Document中的字符串进行转义。提取此String并将其解析为可以简单地从中获取值的最佳方法是什么。
(将接受如何将其恢复为原始XML)
<soap:Body>
<DoItUsernamePwdResponse xmlns="http://www.aspdotnetstorefront.com/">
<DoItUsernamePwdResult><?xml version="1.0" encoding="utf-8"?><AspDotNetStorefrontImportResult Version="9.2" DateTime="9/18/2013 1:46:06 PM"><Item NodeType="Entity" Name="Nike" GUID="84775261-731D-4E11-BB82-FA5F61BC61C5" ID="1" ActionTaken="Add" Status="OK" Message="" /></AspDotNetStorefrontImportResult></DoItUsernamePwdResult>
</DoItUsernamePwdResponse>
</soap:Body>
答案 0 :(得分:3)
只需获取DoItUsernamePwdResult
元素的文本值(例如,使用findnodes
),然后再将结果反馈到XML::LibXML
解析器中。这样的事情可以奏效:
use strict;
use XML::LibXML;
my $xmlxml = <<'EOF';
<soap:Body xmlns:soap="something">
<DoItUsernamePwdResponse xmlns="http://www.aspdotnetstorefront.com/">
<DoItUsernamePwdResult><?xml version="1.0" encoding="utf-8"?><AspDotNetStorefrontImportResult Version="9.2" DateTime="9/18/2013 1:46:06 PM"><Item NodeType="Entity" Name="Nike" GUID="84775261-731D-4E11-BB82-FA5F61BC61C5" ID="1" ActionTaken="Add" Status="OK" Message="" /></AspDotNetStorefrontImportResult></DoItUsernamePwdResult>
</DoItUsernamePwdResponse>
</soap:Body>
EOF
my $xml = XML::LibXML->new->parse_string($xmlxml)->findvalue('//*[local-name()="DoItUsernamePwdResult"]');
warn XML::LibXML->new->parse_string($xml)->serialize;