fb2 책에서 목차를 추출하는 방법은 무엇입니까?

fb2 책에서 목차를 추출하는 방법은 무엇입니까?

fb2 형식의 책이 있습니다. "파트", "챕터", "에피소드" 등의 이름과 번호가 포함된 목차를 인쇄하고 싶습니다.

터미널에서 이 작업을 수행할 수 있는 방법이 있습니까? 하나 있다비슷한 질문이지만 epub 형식의 경우.

fb2가 xml 형식이라는 것을 알고 있습니다. 그런데 TOC만 추출할 수 있는 도구가 있을까요? 레이블 <section><title>에 있습니다 <subtitle>.

그렇지 않은 경우 공식에 따라 xsl 파일을 만들 수 있다고 생각합니다.FB2_to_txt.xsl문서. 아니면 어쩌면전자책 전환이것이 가능합니까?

제가 쓰고 있는 책의 구조는 다음과 같습니다.

<?xml version="1.0" encoding="utf8"?>
<FictionBook xmlns:l="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.gribuser.ru/xml/fictionbook/2.0">
  <description>
    <title-info>
      <genre>fiction</genre>
      <author>
        <first-name>John</first-name>
        <last-name>Doe</last-name>
      </author>
      <book-title>Fiction Book</book-title>
      <annotation>
        <p>Hello</p>
      </annotation>
      <keywords>john, doe, fiction</keywords>
      <date value="2011-07-18">18.07.2011</date>
      <coverpage></coverpage>
      <lang>en</lang>
    </title-info>
    <document-info>
      <author>
        <first-name></first-name>
        <last-name></last-name>
        <nickname></nickname>
      </author>
      <program-used>Fb2 Gem</program-used>
      <date value="2011-07-18">18.07.2011</date>
      <src-url></src-url>
      <src-ocr></src-ocr>
      <id></id>
      <version>1.0</version>
    </document-info>
    <publish-info>
    </publish-info>
  </description>
  <body>
    <title>
      <p>John Doe</p>
      <empty-line/>
      <p>Fiction Book</p>
    </title>
    <section>
      <title>
        <p>Part 1</p>
        <p>Some name of Part 1</p>
      </title>
      <section>
        <title>
          <p>Chapter 1</p>
          <p>Some name of Chapter 1</p>
        </title>
        <subtitle>Episode 1</subtitle>
        <p>Line one of the first episode</p>
        <p>Line two of the first episode</p>
        <p>Line three of the first episode</p>
        <subtitle>Episode 2</subtitle>
        <p>Line one of the second episode</p>
        <p>Line two of the second episode</p>
        <p>Line three of the second episode</p>
      </section>
    </section>
    <section>
      <title>
        <p>Part 2</p>
        <p>Some name of Part 2</p>
      </title>
      <section>
        <title>
          <p>Chapter 3</p>
          <p>Some name of Chapter 3</p>
        </title>
        <subtitle>Episode 3</subtitle>
        <p>Line one of the third episode</p>
        <p>Line two of the third episode</p>
        <p>Line three of the third episode</p>
        <subtitle>Episode 4</subtitle>
        <p>Line one of the fourth episode</p>
        <p>Line two of the fourth episode</p>
        <p>Line three of the fourth episode</p>
      </section>
    </section>
  </body>
</FictionBook>

출력에서 다음을 얻고 싶습니다.

Part 1
Some name of Part 1
Chapter 1
Some name of Chapter 1
Episode 1
Episode 2
Part 2
Some name of Part 2
Chapter 3
Some name of Chapter 3
Episode 3
Episode 4

답변1

사용 xmlstarlet:

xmlstarlet select --template \
    --value-of '//_:section/_:title/_:p | //_:subtitle' \
    -nl file.xml

또는 짧은 옵션을 사용하세요.

xmlstarlet sel -t \
    -v '//_:section/_:title/_:p | //_:subtitle' \
    -n file.xml

여기에 사용된 XPath 쿼리는 아래 각 노드의 값 p뿐만 아니라 모든 노드의 값도 추출합니다.titlesectionsubtitle

표현식에서 각 노드 이름 앞의 접두사는 _:문서에서 사용되는 네임스페이스 식별자에 대한 익명 자리 표시자입니다.

예제 문서에 따르면 위 두 명령 중 하나의 출력은 다음과 같습니다.

Part 1
Some name of Part 1
Chapter 1
Some name of Chapter 1
Episode 1
Episode 2
Part 2
Some name of Part 2
Chapter 3
Some name of Chapter 3
Episode 3
Episode 4

책 제목도 원하시나요? 그런 다음 _:section표현식에서 제한 사항을 제거하세요(이렇게 하면 p책 제목에 대한 노드도 일치하게 됩니다).

좀 더 깔끔하게 보일 수 있는(책 제목 제외) 각 섹션의 제목과 부제를 얻는 또 다른 방법(부제목이 어디에서가 아니라 섹션에서 선택되었음을 표시하기 때문)은 먼저 일치 항목을 부품으로 제한하는 것입니다. 그런 다음 해당 부분에서 데이터를 가져옵니다.

xmlstarlet select --template \
    --match '//_:section' \
    --value-of '_:title/_:p | _:subtitle' \
    -nl file.xml

답변2

XPath3인식 FOSS(GPLv3) 명령줄 도구,xidel:

XPath2 빌드 순서:

xidel -e '(//section/title/p, //subtitle)'  file.xml

XPath1:

xidel -e '//section/title/p | //subtitle'  file.xml

Part 1
Some name of Part 1
Chapter 1
Some name of Chapter 1
Episode 1
Episode 2
Part 2
Some name of Part 2
Chapter 3
Some name of Chapter 3
Episode 3
Episode 4

xidelXML/HTML/JSON을 쿼리하는 스위스 군용 칼입니다. namespace자체적으로 기본 설정을 관리 할 수 있을 만큼 똑똑합니다 .

답변3

출력에는 XPath 표현식의 결과가 포함되어 있는 것 같습니다 (//title/p | //subtitle). 따라서 XPath 표현식을 실행하고 결과를 표시할 수 있는 환경에 적합한 도구를 찾으면 됩니다.

바라보다https://www.baeldung.com/linux/evaluate-xpath몇 가지 제안된 명령줄 도구. Saxon의 Gizmo 도구(저희 회사 제품)도 있습니다.

관련 정보