golang解析和格式化vCard数据插件库go-vcard的使用

golang解析和格式化vCard数据插件库go-vcard的使用

go-vcard 是一个用于解析和格式化 vCard 数据的 Go 语言库,遵循 RFC 6350 标准。

基本用法

以下是一个完整的示例,展示如何使用 go-vcard 库解析 vCard 文件:

package main

import (
	"io"
	"log"
	"os"

	"github.com/emersion/go-vcard"
)

func main() {
	// 打开vCard文件
	f, err := os.Open("cards.vcf")
	if err != nil {
		log.Fatal(err)
	}
	defer f.Close()

	// 创建vCard解码器
	dec := vcard.NewDecoder(f)
	
	// 循环解码每个vCard
	for {
		card, err := dec.Decode()
		if err == io.EOF {
			break  // 文件结束
		} else if err != nil {
			log.Fatal(err)  // 处理错误
		}

		// 获取并打印格式化名称
		log.Println(card.PreferredValue(vcard.FieldFormattedName))
	}
}

创建和格式化vCard

以下示例展示如何创建新的vCard并将其格式化输出:

package main

import (
	"log"
	"os"

	"github.com/emersion/go-vcard"
)

func main() {
	// 创建新的vCard
	card := make(vcard.Card)
	
	// 设置vCard属性
	card.Set(vcard.FieldVersion, "4.0")
	card.Set(vcard.FieldFormattedName, "John Doe")
	card.Set(vcard.FieldName, "Doe;John;;;")
	card.Set(vcard.FieldTelephone, "+1-555-555-5555")
	card.Set(vcard.FieldEmail, "john.doe@example.com")
	
	// 创建文件用于写入
	f, err := os.Create("output.vcf")
	if err != nil {
		log.Fatal(err)
	}
	defer f.Close()
	
	// 创建编码器并写入vCard
	enc := vcard.NewEncoder(f)
	if err := enc.Encode(card); err != nil {
		log.Fatal(err)
	}
}

处理多个vCard字段

vCard可以包含多个相同类型的字段(如多个电话号码),以下是如何处理这种情况:

package main

import (
	"fmt"
	"log"
	"os"

	"github.com/emersion/go-vcard"
)

func main() {
	f, err := os.Open("contacts.vcf")
	if err != nil {
		log.Fatal(err)
	}
	defer f.Close()

	dec := vcard.NewDecoder(f)
	for {
		card, err := dec.Decode()
		if err == io.EOF {
			break
		} else if err != nil {
			log.Fatal(err)
		}

		// 获取所有电话号码
		phones := card.Get(vcard.FieldTelephone)
		for _, phone := range phones {
			fmt.Printf("Phone: %s\n", phone)
		}
	}
}

高级用法:处理vCard属性参数

vCard字段可以包含参数,如电话类型(WORK, HOME等):

package main

import (
	"fmt"
	"log"
	"os"

	"github.com/emersion/go-vcard"
)

func main() {
	card := make(vcard.Card)
	
	// 添加带参数的电话号码
	phoneField := &vcard.Field{
		Value: "+1-555-555-5555",
		Params: vcard.Params{
			"TYPE": []string{"WORK", "VOICE"},
		},
	}
	card.Add(vcard.FieldTelephone, phoneField)
	
	// 打印电话号码及其类型
	for _, field := range card.Get(vcard.FieldTelephone) {
		fmt.Printf("Phone: %s (Type: %v)\n", 
			field.Value, 
			field.Params.Get("TYPE"))
	}
}

注意事项

  1. go-vcard 支持 vCard 3.0 和 4.0 版本
  2. 该库遵循 RFC 6350 标准
  3. 使用前需要通过 go get github.com/emersion/go-vcard 安装

以上示例展示了 go-vcard 库的基本和高级用法,包括解析、创建和处理 vCard 数据。


更多关于golang解析和格式化vCard数据插件库go-vcard的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang解析和格式化vCard数据插件库go-vcard的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用go-vcard解析和格式化vCard数据

go-vcard是一个用于解析和生成vCard格式数据的Go语言库。vCard是一种电子名片的标准文件格式,通常用于交换联系人信息。

安装go-vcard

go get github.com/emersion/go-vcard

基本用法

解析vCard数据

package main

import (
	"fmt"
	"strings"
	
	"github.com/emersion/go-vcard"
)

func main() {
	// 示例vCard数据
	vcardData := `BEGIN:VCARD
VERSION:3.0
FN:张三
N:张;三;;;
TEL;TYPE=WORK,VOICE:13800138000
EMAIL;TYPE=WORK:zhangsan@example.com
END:VCARD`

	// 创建解析器
	dec := vcard.NewDecoder(strings.NewReader(vcardData))
	
	// 解析vCard
	card, err := dec.Decode()
	if err != nil {
		panic(err)
	}
	
	// 获取基本信息
	fmt.Println("姓名:", card.Name().GivenName, card.Name().FamilyName)
	fmt.Println("全名:", card.Get(vcard.FieldFormattedName).Value)
	
	// 获取电话号码
	tel := card.Get(vcard.FieldTelephone)
	if tel != nil {
		fmt.Println("电话:", tel.Value)
		for _, param := range tel.Params {
			fmt.Println("电话类型:", param)
		}
	}
	
	// 获取所有电话号码
	for _, tel := range card.GetAll(vcard.FieldTelephone) {
		fmt.Println("电话号码:", tel.Value)
	}
	
	// 获取电子邮件
	email := card.Get(vcard.FieldEmail)
	if email != nil {
		fmt.Println("邮箱:", email.Value)
	}
}

创建vCard数据

package main

import (
	"os"
	
	"github.com/emersion/go-vcard"
)

func main() {
	// 创建新的vCard
	card := make(vcard.Card)
	
	// 设置版本
	card.SetValue(vcard.FieldVersion, "3.0")
	
	// 设置姓名
	name := &vcard.Name{
		FamilyName: "李",
		GivenName:  "四",
	}
	card.SetName(name)
	
	// 设置全名
	card.SetValue(vcard.FieldFormattedName, "李四")
	
	// 添加电话号码
	card.Add(vcard.FieldTelephone, "13900139000")
	
	// 添加带类型的电话号码
	workTel := vcard.Field{
		Value: "010-12345678",
		Params: vcard.Params{
			"TYPE": []string{"WORK", "VOICE"},
		},
	}
	card.Add(vcard.FieldTelephone, workTel)
	
	// 添加电子邮件
	card.Add(vcard.FieldEmail, "lisi@example.com")
	
	// 添加地址
	addr := vcard.Field{
		Value: ";;北京市海淀区中关村南大街5号;;100081;中国",
		Params: vcard.Params{
			"TYPE": []string{"WORK"},
		},
	}
	card.Add(vcard.FieldAddress, addr)
	
	// 创建编码器
	enc := vcard.NewEncoder(os.Stdout)
	
	// 编码并输出vCard
	if err := enc.Encode(card); err != nil {
		panic(err)
	}
}

高级用法

处理多个vCard

func parseMultipleVCards(data string) {
	dec := vcard.NewDecoder(strings.NewReader(data))
	
	for {
		card, err := dec.Decode()
		if err == io.EOF {
			break
		}
		if err != nil {
			fmt.Println("解析错误:", err)
			continue
		}
		
		fmt.Println("解析到联系人:", card.Get(vcard.FieldFormattedName).Value)
	}
}

自定义字段处理

func handleCustomFields(card vcard.Card) {
	// 处理自定义字段
	if customField := card.Get("X-CUSTOM"); customField != nil {
		fmt.Println("自定义字段:", customField.Value)
	}
	
	// 添加自定义字段
	card.Set("X-PRIORITY", &vcard.Field{
		Value: "High",
	})
}

处理vCard 4.0

func handleVCard40() {
	card := make(vcard.Card)
	card.SetValue(vcard.FieldVersion, "4.0")
	
	// vCard 4.0特有字段
	card.Add("KIND", "individual")
	card.Add("GENDER", "M")
	
	// 添加社交媒体信息
	card.Add("IMPP", "sip:john.doe@example.com")
	card.Add("SOCIALPROFILE", "https://twitter.com/johndoe")
}

注意事项

  1. vCard有多个版本(2.1, 3.0, 4.0),字段支持可能不同
  2. 字段名称在解析时会被转换为大写
  3. 某些字段可能有复杂的结构,需要特殊处理
  4. 处理用户提供的vCard数据时要注意安全性

go-vcard库提供了灵活的方式来处理vCard数据,可以满足大多数电子名片处理的需求。

回到顶部