使用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'] 

任何建议将是最受欢迎的。

+0

也许的libxml无法处理这样一个默认的命名空间?如果你搜索'“// rootfile”'会发生什么? – 2014-09-19 21:29:10

+0

@Mathias它返回nil。 – 2014-09-19 21:45:15

很可能的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的更多信息。

+0

这样做了。顺便说一句,全路径字典键是一个字符串,不像我想的那样是一个符号。我 – 2014-09-20 02:08:49

+0

@HadenPike很高兴它的作品。如果它解决了你的问题,请考虑接受这个答案 - 就像你之前提出的问题一样。谢谢! – 2014-09-20 22:26:05

+0

知道我忘了一些东西。我的错。 – 2014-09-21 00:23:28