0

所以响应基本上是完整的 XML 文档,作为另一个 XML 文档中的字符串转义。提取此字符串并将其解析为我可以简单地从中获取值的最佳方法是什么。

(将简单地接受如何将其恢复为原始 XML)

  <soap:Body>
    <DoItUsernamePwdResponse xmlns="http://www.aspdotnetstorefront.com/">
      <DoItUsernamePwdResult>&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;AspDotNetStorefrontImportResult Version="9.2" DateTime="9/18/2013 1:46:06 PM"&gt;&lt;Item NodeType="Entity" Name="Nike" GUID="84775261-731D-4E11-BB82-FA5F61BC61C5" ID="1" ActionTaken="Add" Status="OK" Message="" /&gt;&lt;/AspDotNetStorefrontImportResult&gt;</DoItUsernamePwdResult>
    </DoItUsernamePwdResponse>
  </soap:Body>
4

1 回答 1

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>&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;AspDotNetStorefrontImportResult Version="9.2" DateTime="9/18/2013 1:46:06 PM"&gt;&lt;Item NodeType="Entity" Name="Nike" GUID="84775261-731D-4E11-BB82-FA5F61BC61C5" ID="1" ActionTaken="Add" Status="OK" Message="" /&gt;&lt;/AspDotNetStorefrontImportResult&gt;</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;
于 2013-09-18T19:33:44.793 回答