xml - 使用 xmlpath.v2 golang 获取节点的值

标签 xml parsing xpath go

我正在使用 gopkg.in/xmlpath.v2 解析 xml 文档,我发现了一个麻烦......我可以毫无问题地从单个节点获取信息,或者获取迭代器并循环遍历其项目以获取其信息。但是,我被阻止的情况是当我尝试从我正在迭代的同一节点获取信息时。我认为一个例子会很有启发性。
这是 XML:

<Warnings>
    <Warning Type="309" ShortText="Unfulfilled Paid Service 1">Unable to book seat 1</Warning>
    <Warning Type="309" ShortText="Unfulfilled Paid Service 2">Unable to book seat 2</Warning>
    <Warning Type="309" ShortText="Unfulfilled Paid Service 3">Unable to book seat 3</Warning>
</Warnings>

这些是我使用的 xpath:

xpath := xPathWarning{
    WarningsBase:       "Warnings/Warning",
    Warning:            "",
    WarningAttr:        "@ShortText",
}

这就是我尝试获取值和属性的方式:

func getWarnings(root *xmlpath.Node, xpath xpath_OC) []Warning {
    warnings := []Warning{}
    v, _ := xmlpath.Compile(xpath.WarningsBase)
    WarningsBaseIter := v.Iter(root)
    for WarningsBaseIter.Next() {
        rawOffer := WarningsBaseIter.Node()
        warning := Warning{
            Value: GetString("", xpath.Warning, rawOffer),
            Attr:  GetString("", xpath.WarningAttr, rawOffer),
        }
        warnings = append(warnings, warning)
    }
    return warnings
}
func GetString(ExpressionPrefix string, XPathExpression string, Node *xmlpath.Node) string {
    Expr := []string{ExpressionPrefix, XPathExpression}
    pathString := strings.Join(Expr, "")
    if pathString != "BLANK" {
        Path, err := xmlpath.Compile(pathString)
        if err == nil {
            Value, _ := Path.String(Node)
            return Value
        }
    }
    return ""
}

我可以获取短文本,但不能获取值。我一直在检查错误,在终端上显示 Path, err := xmlpath.Compile(pathString) 的结果,显示的错误是 compiling xml path "":0: empty path

有什么解决办法吗??
谢谢。

最佳答案

xmlquery包支持通过XPath表达式从XML中提取数据。

package main

import (
    "fmt"
    "strings"

    "github.com/antchfx/xmlquery"
)

func main() {
    xmlStr := `<?xml version="1.0"?><Warnings><Warning Type="309" ShortText="Unfulfilled Paid Service 1">Unable to book seat 1</Warning></Warnings>`
    doc, _ := xmlquery.Parse(strings.NewReader(xmlStr))
    nodes := xmlquery.Find(doc, "//Warning")
    for _, node := range nodes {
        fmt.Println(node.SelectAttr("ShortText"))
        fmt.Println(node.InnerText)
    }
}

关于xml - 使用 xmlpath.v2 golang 获取节点的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45797219/

相关文章:

php - XML 使 PHP 出现意外的字符串错误

javascript - 如何通过selenium从由 <br> 标签分隔的元素中提取部分文本?

java - 如何找到具有随机生成的 id 的元素的 xpath?

java - 为什么在没有它的情况下使用 org.activiti.bpmn.BpmnAutoLayout 为我的 bpmn 文件生成 DI 信息时会出现 NullPointerException?

python - 使用 python 将文本文件解析为矩阵

xml - 将 XML 解码为结构时的空结果

java - 需要带引号的字符串(位置 :DOCDECL @1:50 in java. io.StringReader@4327b040) - Android

css - Selenium XPATH 我在一列中有一个复选框列表。我正在尝试选择第 2 行中的复选框

javascript - 使用 AJAX 从 XML 显示图像

xml - 如何在经典 ASP 中使用地理编码 API v3