【发布时间】:2020-07-06 04:04:52
【问题描述】:
我正在尝试使用 LibXML 从 XML 文件中提取节点值。当我调用findvalue 时,所有相同元素类型的节点都被连接起来。我对使用 LibXML 完全陌生,而且我对 Perl 不是最敏感的。不幸的是,xml 不是最好的。如何提取单个节点?
下面是示例 XML 和输出。 XML 是来自 iTunes 库导出的 sn-p。
<playlists>
<dict>
<key>Name</key><string>Yes - Tales From Topographic Oceans</string>
<key>Description</key><string></string>
<key>Playlist ID</key><integer>67312</integer>
<key>Playlist Persistent ID</key><string>F28F195257143396</string>
<key>All Items</key><true/>
<key>Playlist Items</key>
<array>
<dict>
<key>Track ID</key><integer>25912</integer>
</dict>
<dict>
<key>Track ID</key><integer>25914</integer>
</dict>
<dict>
<key>Track ID</key><integer>25916</integer>
</dict>
<dict>
<key>Track ID</key><integer>25918</integer>
</dict>
</array>
</dict>
<dict>
<key>Name</key><string>Yes - Yessongs</string>
<key>Description</key><string>Live Album</string>
<key>Playlist ID</key><integer>67319</integer>
<key>Playlist Persistent ID</key><string>405B144877D8B8E4</string>
<key>All Items</key><true/>
<key>Playlist Items</key>
<array>
<dict>
<key>Track ID</key><integer>25920</integer>
</dict>
<dict>
<key>Track ID</key><integer>25922</integer>
</dict>
<dict>
<key>Track ID</key><integer>25924</integer>
</dict>
<dict>
<key>Track ID</key><integer>25926</integer>
</dict>
<dict>
<key>Track ID</key><integer>25928</integer>
</dict>
<dict>
<key>Track ID</key><integer>25930</integer>
</dict>
</array>
</dict>
</playlists>
my $dom = XML::LibXML->load_xml(location => $playlistxml);
foreach my $title ($dom->findnodes('//playlists/dict')) {
my $nodestring = $title->findvalue('./string');
print $nodestring, "\n";
foreach my $tracks ($title->findnodes('//playlists/dict/array')) {
my @trackid = $tracks->findvalue('./dict/integer');
print @trackid, "\n";
}
}
这是生成的输出:
Yes - Tales From Topographic OceansF28F195257143396
25912259142591625918
259202592225924259262592825930
Yes - YessongsLive Album405B144877D8B8E4
25912259142591625918
259202592225924259262592825930
期望的输出:
Yes - Tales From Topographic Oceans
25912
25914
25916
25918
Yes - YessongsLive Album
25920
25922
25924
25926
25928
25930
任何帮助将不胜感激
【问题讨论】: