我是新手,试图编写一个脚本来解析多个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>
我想在新行上打印每个result
。
以下是我的代码片段:
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)
}
}
当我在终端中运行它时,它什么都不返回 即。
- - //just the string in the function
我希望能指出如何解决这个问题。
答案 0 :(得分:2)
您的代码存在一些问题:
首先是你的xml
文件不正确,正确的xml文件必须包含像<Data> //Yourdata here </Data>
这样的父xml,它必须如下所示:
<?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())
}
答案 1 :(得分:-1)
从我有限的知识来看,你的任务需要成为一个指针,所以试试 帐户*帐户用户而非帐户帐户用户
您可能希望提供XML,以便其他人更容易理解并显示示例。