xml - 逐行读取 XML 文件

标签 xml go

我是新手,正在尝试编写一个脚本来解析多个 soap 响应。

这是我尝试解析的 xml 的 xml 片段的片段。它是一个完整的 SOAP 响应,但我刚刚包含了我希望解析的标签

            <Results xsi:type="AccountUser">
                <Client>
                    <ID>72rere341</ID>
                </Client>
                <PartnerKey xsi:nil="true" />
                <PartnerProperties>
                    <Name>email</Name>
                    <Value>example1@test1.com</Value>
                </PartnerProperties>
                <ID>755454475</ID>
                <ObjectID xsi:nil="true" />
                <UserID>5fd0acfc-6crerfrgrfe6e9a675f65</UserID>
                <ActiveFlag>true</ActiveFlag>
                <Delete>0</Delete>
                <LastSuccessfulLogin>2014-11-07T16:00:46.747</LastSuccessfulLogin>
            </Results>
            <Results xsi:type="AccountUser">
                <Client>
                    <ID>72rere5341</ID>
                </Client>
                <PartnerKey xsi:nil="true" />
                <PartnerProperties>
                    <Name>email</Name>
                    <Value>example2@test1.com</Value>
                </PartnerProperties>
                <ID>7225483</ID>
                <ObjectID xsi:nil="true" />
                <UserID>example2@test1.com</UserID>
                <ActiveFlag>false</ActiveFlag>
                <Delete>0</Delete>
                <LastSuccessfulLogin>2015-04-29T05:01:27.85</LastSuccessfulLogin>
            </Results>

我想在新行上打印每个结果

这是我的代码片段:

package main 


import (

    "os"
    "fmt"
    "encoding/xml"
    "io/ioutil"

)

type AccountUser struct {


    ParentMID string `xml:"Client>ID"`
    EmailAddress string `xml:"PartnerProperties>Value"`
    BuinessUnit string `xml:"ID"`
    UserID string `xml:"UserID"`
    Active string`xml:"ActiveFlag"`
    LastSucessfulLogin string`xml:"LastSucessfulLogin"`

}

type Email struct {

    Email string `xml:"PartnerProperties>Value"`
}


type Query struct {
    Accounts AccountUser
    AccountList []Email `xml:"PartnerProperties>Value"`
}

func (a AccountUser) String() string {
    return fmt.Sprintf("%s - %s - %s", a.ParentMID, a.EmailAddress, a.UserID)
}


func main() {
    xmlFile, err := os.Open("Results.xml")
    if err != nil {
        fmt.Println("Error opening file:", err)
        return
    }
    defer xmlFile.Close()

    b, _ := ioutil.ReadAll(xmlFile)

    var q Query
    xml.Unmarshal(b, &q)

    fmt.Println(q.Accounts)
    for _, account := range q.AccountList {
        fmt.Printf("\t%s\n", account)
    }
}

当我在终端中运行它时,它什么都不返回 IE。

-     - //just the string in the function

我很想知道如何解决这个问题。

最佳答案

你的代码有一些问题:

首先是您的 xml文件不正确 正确的 xml 文件必须包含父 xml,如 <Data> //Yourdata here </Data>它必须看起来像这样:

<?xml version="1.0" encoding="UTF-8" ?>
<Data>
    <Results>
        <Client>
            <ID>72rere341</ID>
        </Client>
        <PartnerKey xsi:nil="true" />
        <PartnerProperties>
            <Name>email</Name>
            <Value>example1@test1.com</Value>
        </PartnerProperties>
        <ID>755454475</ID>
        <ObjectID xsi:nil="true" />
        <UserID>5fd0acfc-6crerfrgrfe6e9a675f65</UserID>
        <ActiveFlag>true</ActiveFlag>
        <Delete>0</Delete>
        <LastSuccessfulLogin>2014-11-07T16:00:46.747</LastSuccessfulLogin>
    </Results>
    <Results>
        <Client>
            <ID>72rere5341</ID>
        </Client>
        <PartnerKey xsi:nil="true" />
        <PartnerProperties>
            <Name>email</Name>
            <Value>example2@test1.com</Value>
        </PartnerProperties>
        <ID>7225483</ID>
        <ObjectID xsi:nil="true" />
        <UserID>example2@test1.com</UserID>
        <ActiveFlag>false</ActiveFlag>
        <Delete>0</Delete>
        <LastSuccessfulLogin>2015-04-29T05:01:27.85</LastSuccessfulLogin>
    </Results>
</Data>

第二个结构 AccountUser有一个方法:

func (a AccountUser) String() string {
    return fmt.Sprintf("%s - %s - %s", a.ParentMID, a.EmailAddress, a.UserID)
}

要解决您的问题,请修复您的 xml 文件,并制作您的 String()像这样的方法:

func (a *AccountUser) String() string {
    return ""
}

这是我用上面的 xml 文件尝试过的工作代码:

package main

import (
    "encoding/xml"
    "fmt"
    "io/ioutil"
    "log"
    "os"
)

type AccountUser struct {
    UserID              string
    ActiveFlag          string
    LastSuccessfulLogin string
    PartnerProperties   Partner `xml:"PartnerProperties"`
}

type Partner struct {
    Name  string
    Value string
}

type Query struct {
    ResultList []AccountUser `xml:"Results"`
}

func (a *AccountUser) String() string {
    return fmt.Sprintf("%s - %s - %s", a.PartnerProperties.Name, a.PartnerProperties.Value, a.UserID)
}

func main() {
    xmlFile, err := os.Open("read.xml")
    if err != nil {
        fmt.Println("Error opening file:", err)
        return
    }
    defer xmlFile.Close()

    b, err := ioutil.ReadAll(xmlFile)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("read result = ", string(b))

    var q Query
    err = xml.Unmarshal(b, &q)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(q.ResultList[0].String())
}

关于xml - 逐行读取 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47318602/

相关文章:

java - 如何使用jaxb获取anyType值?

XML 到 excel 错误

go - 为什么 $GOPATH 通常设置在 ~/.bashrc 和 ~/.bash_profile 而不是 ~/.profile 中?

android - 自定义布局的 XML 未绑定(bind)错误

c# - 如何使用 System.XAML 定义来自多个输入行的值来注释 C#/WPF 中的一行 XAML 文件

java - 另一个 Java XML 库问题

http - Golang http 服务文件 - 提供并行下载支持 - contentLength 和接受范围不起作用

go - 如何使用 Golang 查找以 root 身份执行程序的用户?

type-conversion - 如何在 go 中使用带有范围的自定义 int 类型?

go - 响应后验证证书