2017-10-11 8 views
0

Goアーカイブのzipおよびencoding/xmlパッケージを使用して、いくつかのXMLファイルを含むzipファイルがあります。私がしたいことは、a.xmlのタイプを-i.eにアンマーシャリングすることです。内のすべてのファイルを経由せずにループ:特定のXMLファイルを解凍せずにzipから非マーシャル化

test.zip 
├ a.xml 
├ b.xml 
└ ... 

a.xmlのような構造を持っているでしょう:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <app> 
     <code>0001</code> 
     <name>Some Test App</name> 
    </app> 
    <app> 
     <code>0002</code> 
     <name>Another Test App</name> 
    </app> 
</root> 

どのように選択のために、その名前のために、コメントアウト行にパラメータとして提供されているファイルをアンマーシャリングインスタンス:

package marshalutils 

import (
    "archive/zip" 
    "log" 
    "fmt" 
    "encoding/xml" 
) 

type ApplicationRoot struct { 
    XMLName xml.Name `xml:"root"` 
    Applications []Application `xml:"app"` 
} 

type Application struct { 
    Code string `xml:"code"` 
    Name string `xml:"name"` 
} 

func UnmarshalApps(zipPath string, fileName string) { 
    // Open a zip archive for reading. 
    reader, err := zip.OpenReader(zipFilePath) 
    if err != nil { 
     log.Fatal(`ERROR:`, err) 
    } 

    defer reader.Close() 

    /* 
    * U N M A R S H A L T H E G I V E N F I L E ... 
    * ... I N T O T H E T Y P E S A B O V E 
    */ 
} 
+0

ドキュメントの例は、['zip.Reader'](https://golang.org/pkg/archive/zip/#example_Reader)の使用方法を示しています。あなたが望まないファイルを飛ばしてください。 – JimB

+0

だから、ループせずに名前を確認することもできません。 – vahdet

+1

zipファイルにはファイル名のリストが含まれています。あなたはそのリストをループせずにリスト内の名前をどのように探すでしょうか?あなたはすべてのファイルを抽出する必要はなく、ドキュメントのその例のように名前をループします。 – JimB

答えて

0

さて、ここで私は戻り値の型宣言を見つけた答えはサンプル関数に追加されます。

func UnmarshalApps(zipPath string, fileName string) ApplicationRoot { 
    // Open a zip archive for reading. 
    reader, err := zip.OpenReader(zipFilePath) 
    if err != nil { 
     log.Fatal(`ERROR:`, err) 
    } 

    defer reader.Close() 

    /* 
    * START OF ANSWER 
    */ 
    var appRoot ApplicationRoot 
    for _, file := range reader.File { 
     // check if the file matches the name for application portfolio xml 
     if file.Name == fileName { 
      rc, err := file.Open() 
      if err != nil { 
       log.Fatal(`ERROR:`, err) 
      } 

      // Prepare buffer 
      buf := new(bytes.Buffer) 
      buf.ReadFrom(rc) 

      // Unmarshal bytes 
      xml.Unmarshal(buf.Bytes(), &appRoot) 
      rc.Close() 
     } 
    } 
    /* 
    * END OF ANSWER 
    */  
} 
関連する問題