使用Ruby和LibXNL解析EPUB容器

时间:2014-09-19 21:16:17

标签: ruby xml xpath epub

我有Ruby代码,用于查看提取的EPUB 文件,找到OPF元数据文件的位置并将其返回。该 写入OPF文件的路径(相对于EPUB的根目录) 到META-INF / container.xml中的XML文件。文件内容是 如下:

<?xml version="1.0"?>
<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
   <rootfiles>
      <rootfile full-path="content.opf" media-type="application/oebps-package+xml"/>
   </rootfiles>
</container>

我使用LibXML和XPath来提取根文件路径。问题 是LibXML报告我的XPath表达式无效。相同 表达式在使用Python和LXML时有效。相关部分 我的代码如下。

require 'libxml'
include LibXML
container = File.join("META-INF", "container.xml")
tree = XML::Document.file(container)
rootfile = tree.find_first("//{urn:oasis:names:tc:opendocument:xmlns:container}rootfile")['full-path']

欢迎任何建议。

1 个答案:

答案 0 :(得分:1)

LibXML处理默认命名空间的方式可能与lxml不同。尝试为命名空间定义别名(即前缀)。

require 'libxml'
include LibXML
container = File.join("META-INF", "container.xml")
tree = XML::Document.file(container)
tree.root.namespaces.default_prefix = 'opf'
rootfile = tree.find_first("//opf:rootfile")['full-path']

或者,将find_first与第二个参数一起使用,包含名称空间声明:

require 'libxml'
include LibXML
container = File.join("META-INF", "container.xml")
tree = XML::Document.file(container)
rootfile = tree.find_first("//opf:rootfile", "opf:urn:oasis:names:tc:opendocument:xmlns:container)['full-path']

但是你需要提前知道这个命名空间并对其进行硬编码。查找有关使用命名空间here的更多信息。