动态结构元素上的编码/xml解组

动态结构元素上的编码/xml解组,xml,go,Xml,Go,我正在使用Golang使用epubs,我必须从cover.xhtml文件(或.opf文件中提到的任何文件)获取封面图像 我的问题是Cover.xhtml文件中元素的动态结构。 每个epubs在Cover.xhtml文件上具有不同的结构。比如说, <body> <figure id="cover-image"> <img src="covers/9781449328030_lrg.jpg" alt="First Edition" />

我正在使用Golang使用epubs,我必须从cover.xhtml文件(或.opf文件中提到的任何文件)获取封面图像

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

每个epubs在Cover.xhtml文件上具有不同的结构。比如说,

<body>
    <figure id="cover-image">
        <img src="covers/9781449328030_lrg.jpg" alt="First Edition" />
    </figure>
</body>
输出为:

{{}}
我期望的结果是:

{{covers/9781449328030_lrg.jpg}}

提前谢谢

这将从读入文件中拉出
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)
XMLContent,err=ioutil.ReadFile(“./uploads/moby-dick/OPS/cover.xhtml”)
检查错误(err)
//解析XMLContent以获取img元素
strContent:=字符串(XMLContent)
imgLoc:=strings.Index(strContent,“

这将为第一个输入文件生成{covers/9781449328030_lrg.jpg}的结果,并{@public@vhost@g@gutenberg@html@files@54869@54869-h@images@cover.jpg}对于您提供的第二个输入文件。

有两个问题:第一:为什么您希望将
body>figure>img
解组到平面CPR中应该会起作用?body和figure应该去哪里?xml解组不是这样工作的。第二:您需要一些编程来区分不同的格式并以不同的方式解组它们。对不起,我是刚接触golang的。有没有办法通过字符串处理来解析图像链接?如果可以解组,为什么还要处理字符串(尽管不是在太简单的结构中)?@Volker这就是XML解组的工作原理。body和figure不必去任何地方。XML中没有出现在结构中的元素会被简单地删除,就像JSON一样。@mk答案中有一个可行的解决方案,但我想我会放弃另一个选项,使用XPath。stdlib中没有XPath支持,但有几个第三方p实现它的arty库。您可以使用它动态地从XML文档中选择元素,而无需解组。非常感谢!特别是您接受了我的代码并给了我一个示例:)是的,cover.xhtml文件中只有一个img标记。
{{covers/9781449328030_lrg.jpg}}
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)