如何从xml的根元素获得第一级注释

时间:2017-01-26 20:32:50

标签: xml go

我的xsd文件具有以下结构:

<?xml version="1.0" encoding="UTF-8"?>
<!-- EIS docs-ws-api Integration Scheme, version 6.4, create date 15.11.2016 -->
<someTag></someTag>

如何获得此评论? 我尝试在游乐场https://play.golang.org/p/PVHux_Gvb7

上做到了

2 个答案:

答案 0 :(得分:1)

正如在其他答案中所提到的,xml.Unmarshal只有在它是XML元素的一部分时才能解析注释。

实现xmlpath规范的外部库XPath在您的情况下非常有用。

  

安装:go get gopkg.in/xmlpath.v1

让我们从您的示例x​​ml中提取preceding标记someTag的注释。

import (
    "fmt"
    "log"

    "strings"

    xmlpath "gopkg.in/xmlpath.v1"
)

func main() {
    data := `
<?xml version="1.0" encoding="UTF-8"?>
<!-- EIS docs-ws-api Integration Scheme, version 6.4, create date 15.11.2016 -->
<someTag></someTag>
`
    path := xmlpath.MustCompile("/someTag/preceding::comment()")
    root, err := xmlpath.Parse(strings.NewReader(data))
    if err != nil {
        log.Fatal(err)
    }
    if comment, ok := path.String(root); ok {
        fmt.Println(comment)
    }
}

答案 1 :(得分:0)

简短回答:上面的评论不在root元素中。它在根元素之外,因此xml.Unmarshal无法读取它

<强>说明

  

每个XML文档只有一个根元素。它包含了所有   其他元素,因此是所有的唯一的父元素   其他元素。 ROOT元素也称为文档元素。

根据encoding/xml的文件

  
      
  • 如果XML元素包含注释,它们将累积在第一个包含标记&#34;,comment&#34;的结构字段中。结构域可以   有类型[]字节或字符串。如果没有这样的字段,评论   被丢弃了。
  •   

由于评论在所有元素之外。您可能无法将其解码为结构

接下来是XML文档的扩展示例,演示了rootElement元素和标题。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE example [<!ENTITY copy "&#xA9;">    
<rootElement attribute="xyz">
   <contentElement/>
</rootElement>
<!-- comment nodes may appear almost anywhere -->

以下是针对W3C的XML格式的当前(2017年1月)标准:link