【发布时间】:2017-10-10 08:29:21
【问题描述】:
我正在使用 XML::Twig 解析 Azure 的 list-blob REST API 的输出。
特别是,我希望识别和删除未提交的孤立 blob,但我不确定如何最好地有效地使用 XML::Twig 来执行此操作。我什至不知道从哪里开始。
最终我需要检索孤立 blob 的 <Name> 元素。
响应中未提交的 Blob
只有当 include=uncommittedblobs 参数是在 URI 上指定的。 响应中列出的未提交 blob 不包括任何 以下元素:
Last-Modified Etag Content-Type Content-Encoding Content-Language Content-MD5 Cache-Control Metadata
因此,在下面的简化示例中,您可以看到一个名为“test”的孤立 blob,因为 <Blob></Blob> 块不包含上述任何元素。
<?xml version="1.0" encoding="utf-8"?>
<EnumerationResults ServiceEndpoint="https://my**account.blob.core.windows.net/"
ContainerName="testonly">
<Blobs>
<Blob>
<Name>test</Name>
<Properties>
<Content-Length>0</Content-Length>
<BlobType>BlockBlob</BlobType>
<LeaseStatus>unlocked</LeaseStatus>
<LeaseState>available</LeaseState>
</Properties>
</Blob>
</Blobs>
<NextMarker/>
</EnumerationResults>
更新:
实际上,我可能过于简单化了。接受的答案似乎不适用于以下内容,它会打印所有内容:
<?xml version="1.0" encoding="utf-8"?>
<EnumerationResults ServiceEndpoint="https://my**account.blob.core.windows.net/" ContainerName="testonly">
<Blobs>
<Blob>
<Name>data/users/docx</Name>
<Properties>
<Last-Modified>Wed, 10 May 2017 20:21:25 GMT</Last-Modified>
<Etag>0x8D497E221E7A5AF</Etag>
<Content-Length>125632</Content-Length>
<Content-Type>application/octet-stream</Content-Type>
<Content-Encoding/>
<Content-Language/>
<Content-MD5/>
<Cache-Control/>
<Content-Disposition/>
<BlobType>BlockBlob</BlobType>
<LeaseStatus>unlocked</LeaseStatus>
<LeaseState>available</LeaseState>
</Properties>
</Blob>
<Blob>
<Name>test</Name>
<Properties>
<Content-Length>0</Content-Length>
<BlobType>BlockBlob</BlobType>
<LeaseStatus>unlocked</LeaseStatus>
<LeaseState>available</LeaseState>
</Properties>
</Blob>
</Blobs>
<NextMarker/>
</EnumerationResults>
我的代码:
sub blob_parse {
my $blob = $_;
$blob->first_child($_) and return
for qw( Last-Modified Etag Content-Type Content-Encoding
Content-Language Content-MD5 Cache-Control Metadata);
say "orph: ".$blob->first_child('Name')->text;
}
sub parseAndDelete {
### ORPHAN
$twig_handlers = {'Blobs/Blob' => \&blob_parse};
$twig = new XML::Twig(twig_handlers=>$twig_handlers);
$twig->parse($message);
}
【问题讨论】:
-
所以您是说 XML 格式错误,带有结束
</Blob>标记但没有开始<Blob>?我怀疑XML::Twig是否会处理这个问题。 -
@Borodin 不!那只是我的复制粘贴失败(通过 TMUX 从 Linux 复制/粘贴有时会做一些奇怪的事情。我已经修复了它。
-
我发现了。我已经更新了我的答案,并在 choroba's 的评论中进行了修复。你可以选择任何你喜欢的!
标签: perl xml-parsing azure-storage xml-twig