如何使用XML :: LibXML解析转义的XML

时间:2013-09-18 19:10:25

标签: xml perl xml-parsing xml-libxml

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

(将接受如何将其恢复为原始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>

1 个答案:

答案 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>&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;