我使用Golang使用epub ,我必须从cover.xhtml文件(或.opf文件中提到的任何文件)中获取封面图像。
我的问题在于Cover.xhtml文件中元素的动态结构。
每个epubs在Cover.xhtml文件中都有不同的结构。例如,
<body>
<figure id="cover-image">
<img src="covers/9781449328030_lrg.jpg" alt="First Edition" />
</figure>
</body>
另一个epub cover.xhtml文件
<body>
<div>
<img src="@public@vhost@g@gutenberg@html@files@54869@54869-h@images@cover.jpg" alt="Cover" />
</div>
</body>
我需要从此文件中获取img标记的src属性。但我无法做到。
以下是我的代码中涉及解组cover.xhtml文件的部分
type CPSRCS struct {
Src string `xml:"src,attr"`
}
type CPIMGS struct {
Image CPSRCS `xml:"img"`
}
XMLContent, err = ioutil.ReadFile("./uploads/moby-dick/OPS/cover.xhtml")
CheckError(err)
coverFile := CPIMGS{}
err = xml.Unmarshal(XMLContent, &coverFile)
CheckError(err)
fmt.Println(coverFile)
输出结果为:
{{}}
我期待的输出是:
{{covers/9781449328030_lrg.jpg}}
提前致谢!
答案 0 :(得分:1)
这将从读入文件中提取img
元素,然后从元素中解组src属性。这假设你只需要从文件中获取第一个img
元素。
XMLContent, err = ioutil.ReadFile("./uploads/moby-dick/OPS/cover.xhtml")
CheckError(err)
//Parse the XMLContent to grab just the img element
strContent := string(XMLContent)
imgLoc := strings.Index(strContent, "<img")
prefixRem := strContent[imgLoc:]
endImgLoc := strings.Index(prefixRem, "/>")
//Move over by 2 to recover the '/>'
trimmed := prefixRem[:endImgLoc+2]
var coverFile CPSRCS
err = xml.Unmarshal([]byte(trimmed), &coverFile)
CheckError(err)
fmt.Println(coverFile)
这将为第一个输入文件生成{covers / 9781449328030_lrg.jpg}的结果,并为{@ public @vhost @ g @ gutenberg @html @ files @ 54869 @ 54869-h @ images @ cover.jpg}生成你提供的第二个输入文件。