在标记中用冒号解析复杂的嵌套 xml

Parsing complex nested xml with colon in tags

我正在尝试解析以下 xml :

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
   <env:Body>
      <wd:Get_Workers_Response wd:version="v35.0" xmlns:wd="urn:com.workday/bsvc">
         <wd:Request_References>
            <wd:Worker_Reference>
               <wd:ID wd:type="WID">11112222333444</wd:ID>
               <wd:ID wd:type="Employee_ID">123456789</wd:ID>
            </wd:Worker_Reference>
         </wd:Request_References>
        <wd:Response_Data>
            <wd:Worker>

               <wd:Worker_Descriptor>user xyz</wd:Worker_Descriptor>
               <wd:Worker_Data>
                  <wd:Worker_ID>123456789</wd:Worker_ID>
                  <wd:User_ID>user_one_id</wd:User_ID>
                  <wd:Personal_Data>

                     <wd:Contact_Data>

                       <wd:Email_Address_Data>
                           <wd:Email_Address>abc@gmail.com</wd:Email_Address>
                           <wd:Usage_Data wd:Public="1">
                              <wd:Type_Data wd:Primary="1">
                                 <wd:Type_Reference>
                                    <wd:ID wd:type="WID">12346780</wd:ID>
                                    <wd:ID wd:type="Communication_Usage_Type_ID">WORK</wd:ID>
                                 </wd:Type_Reference>
                              </wd:Type_Data>
                           </wd:Usage_Data>
                           <wd:Email_Reference>
                              <wd:ID wd:type="WID">0987654321</wd:ID>
                              <wd:ID wd:type="Email_ID">EMAIL_REFERENCE-3-1</wd:ID>
                           </wd:Email_Reference>
                           <wd:ID>EMAIL_REFERENCE-3-1</wd:ID>
                        </wd:Email_Address_Data>
                     </wd:Contact_Data>
                     
                  </wd:Personal_Data>


                 </wd:Worker_Data>
            </wd:Worker>
         </wd:Response_Data>
      </wd:Get_Workers_Response>
   </env:Body>
</env:Envelope>

我试过这个结构:

type ElementOne struct {
    XMLName xml.Name `xml:"Envelope"`
    Bar     interface{}    `xml:"env:Body>wd:Get_Workers_Response "`
}

我无法进入 <env:Body> 标签。由于冒号,解析似乎不起作用。我也尝试转义冒号 (env\:Body)。 我需要来自此 xml 的以下值:来自 Worker_ReferenceWIDEmployee_IDwd:Email_Address_Data[=20= 中的嵌套标签内的 Email_ID ]

非常感谢任何帮助,我是 xml 解析的新手,所以我可能在这里遗漏了一些东西。

谢谢。

您在结构标签中使用了错误的语法。

仅 WID 和 Employee_ID 的示例:

type wdID struct {
    ID      string `xml:"type,attr"`
    Content string `xml:",chardata"`
}

type exampleStruct struct {
    XMLName xml.Name `xml:"Envelope"`
    WIDs     []wdID   `xml:"Body>Get_Workers_Response>Request_References>Worker_Reference>ID"`
}

此外,由于您的标签名称会重复(多个“ID”),您必须将它们解析为一个数组,在该数组中您可以获得区分它们的唯一属性(wdID 结构)。

使用您提供的 XML 的较小版本的工作示例去游乐场:https://play.golang.org/p/BS8crPQ7G1n

编辑:https://golang.org/pkg/encoding/xml/#Unmarshal 如果您阅读 XML Unmarshal'er 的评论,您可以找到一些关于结构标记细节的花絮