encoding / xml在动态结构元素上解组

时间:2017-06-15 11:25:38

标签: xml go

使用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}}

提前致谢!

1 个答案:

答案 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}生成你提供的第二个输入文件。