2017-06-15 35 views
0

我是使用golang使用epubs,我必须从cover.xhtml文件(或任何在.opf文件中提到的文件)获取封面图片。encoding/xml对动态结构元素解组

我的问题是在Cover.xhtml文件的元素的动态结构。

每个ePub文件时对文件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="@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]" 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

有两个问题:第一:为什么你认为把'body>> figure> img'解组成一个单一的CPRS应该可以工作?身体和身材应该去哪里?这不是xml解组的工作原理。第二:您需要一些编程来区分不同的格式,然后以不同的方式对它们进行解组。 – Volker

+0

对不起,我是新来的golang ..有没有办法解析通过字符串处理图像链接? – rnk

+0

如果你可以解组(不管你的结构是否太简单),为什么你会乱搞? – Volker

回答

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) 

这将产生{盖/ 9781449328030_lrg.jpg}用于第一输入文件的结果和{@公共@虚拟主机@克@古滕贝格@ HTML文件@ @ 54869 @ 54869小时@图像@盖。 jpg}为您提供的第二个输入文件。

+0

非常感谢!尤其是你拿了我的代码,并给了我一个例子:)是的,cover.xhtml文件中只有一个img标签。 – rnk