使用Ruby和LibXNL
解析EPUB容器我有打算看看提取EPUB 文件中,找到OPF元数据文件的位置,并返回Ruby代码。所述 路径OPF文件(相对于EPUB的根目录)被写入到 在META-INF/container.xml中发现的XML文件。文件内容是 如下:使用Ruby和LibXNL
<?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']
任何建议将是最受欢迎的。
很可能的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的更多信息。
这样做了。顺便说一句,全路径字典键是一个字符串,不像我想的那样是一个符号。我 – 2014-09-20 02:08:49
@HadenPike很高兴它的作品。如果它解决了你的问题,请考虑接受这个答案 - 就像你之前提出的问题一样。谢谢! – 2014-09-20 22:26:05
知道我忘了一些东西。我的错。 – 2014-09-21 00:23:28
也许的libxml无法处理这样一个默认的命名空间?如果你搜索'“// rootfile”'会发生什么? – 2014-09-19 21:29:10
@Mathias它返回nil。 – 2014-09-19 21:45:15