2014-09-19 3 views
0

추출 된 EPUB 파일을보고 루비 코드가 있습니다. OPF 메타 데이터 파일의 위치를 ​​찾아서 반환하십시오. OPF 파일의 경로 (EPUB의 루트와 관련 있음)는 META-INF/container.xml에있는 XML 파일에 으로 기록됩니다. 내가 루트 파일 경로를 추출 LibXML과 XPath를 사용하고Ruby 및 LibXNL을 사용하는 EPUB 컨테이너를 파싱하십시오.

<?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 표현식이 유효하지 않다는보고입니다. 동일한 표현식은 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 "'을 검색하면 어떻게됩니까? –

+0

@Mathias nil을 반환합니다. –

답변

1

LibXML이 기본 네임 스페이스를 처리하는 방식이 lxml과 다를 수 있습니다. 네임 스페이스에 대한 별칭 (예 : 접두어)을 정의합니다.

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

을하지만 당신은 사전 및 하드 코드 그것에서이 네임 스페이스를 알아야합니다

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를 사용합니다. 네임 스페이스 작업에 대한 자세한 정보는 here을 참조하십시오.

+0

그랬습니다. 제쳐두고 전체 경로 사전 키는 내가 생각한 것처럼 문자열이 아닙니다. I –

+0

@HadenPike 다행입니다. 이전 질문과 마찬가지로 문제를 해결 한 경우이 대답을 수락하십시오. 감사! –

+0

알았어. 뭔가 잊어 버렸어. 내 잘못이야. –