从 href 元素中提取文件名

从 href 元素中提取文件名

我有一个包含文件列表的文档。有什么简单的方法可以提取 href 元素内的文件名(不带引号)并将它们复制到以换行符分隔的列表中?

<manifest>
<item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
<item id="css" href="845214570.css" media-type="text/css"/>
<item id="cover-image" href="845214570.jpg" media-type="image/jpeg"/>
<item id="nav" href="nav.xhtml" media-type="application/xhtml+xml" properties="nav"/>
<item id="cover" href="cover.xhtml" media-type="application/xhtml+xml"/>
<item id="author" href="author.xhtml" media-type="application/xhtml+xml"/>
<item id="title" href="title.xhtml" media-type="application/xhtml+xml"/>
<item id="copy" href="copy.xhtml" media-type="application/xhtml+xml"/>
<item id="contents" href="contents.xhtml" media-type="application/xhtml+xml"/>
<item id="preface" href="preface.xhtml" media-type="application/xhtml+xml"/>
<item id="ack" href="ack.xhtml" media-type="application/xhtml+xml"/>
<item id="ch1" href="ch1.xhtml" media-type="application/xhtml+xml"/>
<item id="ch2" href="ch2.xhtml" media-type="application/xhtml+xml"/>
<item id="ch3" href="ch3.xhtml" media-type="application/xhtml+xml"/>
<item id="ch4" href="ch4.xhtml" media-type="application/xhtml+xml"/>
<item id="ch5" href="ch5.xhtml" media-type="application/xhtml+xml"/>
<item id="ch6" href="ch6.xhtml" media-type="application/xhtml+xml"/>
<item id="ch7" href="ch7.xhtml" media-type="application/xhtml+xml"/>
<item id="ch8" href="ch8.xhtml" media-type="application/xhtml+xml"/>
<item id="ch9" href="ch9.xhtml" media-type="application/xhtml+xml"/>
<item id="ch10" href="ch10.xhtml" media-type="application/xhtml+xml"/>
<item id="ch11" href="ch11.xhtml" media-type="application/xhtml+xml"/>
<item id="app" href="app.xhtml" media-type="application/xhtml+xml"/>
<item id="appb" href="appb.xhtml" media-type="application/xhtml+xml"/>
<item id="appc" href="appc.xhtml" media-type="application/xhtml+xml"/>
<item id="index" href="index.xhtml" media-type="application/xhtml+xml"/>
<item id="img-f0019-01" href="f0019-01.jpg" media-type="image/jpeg"/>
<item id="img-f0027-01" href="f0027-01.jpg" media-type="image/jpeg"/>
<item id="img-f0029-01" href="f0029-01.jpg" media-type="image/jpeg"/>
</manifest>

答案1

对于具有这种简单格式的 XML 文件,您可以使用grep

grep -Po 'href="\K[^"]*' file.xml > filenames.lst
  • -P使用 Perl 兼容正则表达式 (PCRE)
  • -o仅输出匹配项
  • \K 保持一切直到比赛结束
  • [^"]*匹配任意数量的字符 ( *),但不是 ( ^) 双引号 ( ")。

但是,如果您有一个更复杂的xml,您可以并且应该选择合适的xml解析器,例如xmlstarlet

xmlstarlet sel -t -v '//item/@href' -n file.xml > filenames.lst

可以通过以下方式安装

sudo apt install xmlstarlet

由于您已用 标记了您的问题python,因此当然您也可以使用它:

#!/usr/bin/env python3
import xml.etree.ElementTree as ET
root = ET.parse('file.xml')
for item in root.findall('.//item'):
    print(item.attrib['href'])

相关内容