Android 使用 ez-vcard 无法从 VCARD 获取正确的街道地址
Android not getting proper street address from VCARD using ez-vcard
我正在使用 ez-vcard (https://github.com/mangstadt/ez-vcard) 来解析 VCARD 字符串。例如 VCARD 字符串之一是
"BEGIN:VCARD\n" +
"N:Mandal;Saroj\n" +
"FN:Saroj Mandal\n" +
"ORG:xyz\n" +
"TITLE:Advisory Software Engineer\n" +
"TEL;WORK:022-123456\n" +
"TEL;CELL:1234567890\n" +
"TEL;FAX:1234567890\n" +
"ADR;ADDRESS:;;D-100, Tech Heights, Sainikwadi, Wadgaonshri;Pune;Maharashtra;411014;India\n" +
"LABEL;ADDRESS;ENCODING=QUOTED-PRINTABLE:D-100,Tech Heights, Sainikwadi, Wadgaonshri=0D=0Pune, Maharashtra=0D=0411014=0D=0India\n" +
"EMAIL;PREF;INTERNET:hificoders@gmail.com\n" +
"URL;WORK:http://www.example.com\n" +
"END:VCARD";
在 android 中,我想要上面示例 VCARD 字符串中的街道地址
我使用了下面的代码
for(Address address :vcard.getAddresses()){
Log.d(TAG, "Street address" + address.getStreetAddress());
}
但我只得到 D-100 作为街道地址,它应该是 D-100, Tech Heights, Sainikwadi, Wadgaonshri,但是如果我从上面的 VCARD 中删除逗号 (,),那么我会得到整个字符串。请给出一些解决方案。
逗号字符必须在 ADR 中转义 属性。在所有逗号前加反斜杠。
"ADR;ADDRESS:;;D-100\, Tech Heights\, Sainikwadi\, Wadgaonshri;Pune;Maharashtra;411014;India\n" +
此外,为什么要在 属性 中使用无值 "ADDRESS" 参数?请删除它。
"ADR:;;D-100\, Tech Heights\, Sainikwadi\, Wadgaonshri;Pune;Maharashtra;411014;India\n" +
编辑(2015 年 7 月 27 日):
回答您评论中的问题:
要强制解析器将逗号视为普通字符,您可以注册自定义 scribe class,它扩展标准 AddressScribe
scribe 并覆盖其解析函数:
VCardReader reader = new VCardReader(...);
reader.getScribeIndex().register(new AddressScribe() {
@Override
protected Address _parseText(String value, VCardDataType dataType, VCardVersion version, VCardParameters parameters, List<String> warnings) {
String components[] = value.split(";");
int i = 0;
Address property = new Address();
property.setPoBox(next(components, i++));
property.setExtendedAddress(next(components, i++));
property.setStreetAddress(next(components, i++));
property.setLocality(next(components, i++));
property.setRegion(next(components, i++));
property.setPostalCode(next(components, i++));
property.setCountry(next(components, i++));
return property;
}
private String next(String components[], int index) {
if (index >= components.length) {
return null;
}
String next = components[index];
return (next.length() > 0) ? next : null;
}
});
我正在使用 ez-vcard (https://github.com/mangstadt/ez-vcard) 来解析 VCARD 字符串。例如 VCARD 字符串之一是
"BEGIN:VCARD\n" +
"N:Mandal;Saroj\n" +
"FN:Saroj Mandal\n" +
"ORG:xyz\n" +
"TITLE:Advisory Software Engineer\n" +
"TEL;WORK:022-123456\n" +
"TEL;CELL:1234567890\n" +
"TEL;FAX:1234567890\n" +
"ADR;ADDRESS:;;D-100, Tech Heights, Sainikwadi, Wadgaonshri;Pune;Maharashtra;411014;India\n" +
"LABEL;ADDRESS;ENCODING=QUOTED-PRINTABLE:D-100,Tech Heights, Sainikwadi, Wadgaonshri=0D=0Pune, Maharashtra=0D=0411014=0D=0India\n" +
"EMAIL;PREF;INTERNET:hificoders@gmail.com\n" +
"URL;WORK:http://www.example.com\n" +
"END:VCARD";
在 android 中,我想要上面示例 VCARD 字符串中的街道地址 我使用了下面的代码
for(Address address :vcard.getAddresses()){
Log.d(TAG, "Street address" + address.getStreetAddress());
}
但我只得到 D-100 作为街道地址,它应该是 D-100, Tech Heights, Sainikwadi, Wadgaonshri,但是如果我从上面的 VCARD 中删除逗号 (,),那么我会得到整个字符串。请给出一些解决方案。
逗号字符必须在 ADR 中转义 属性。在所有逗号前加反斜杠。
"ADR;ADDRESS:;;D-100\, Tech Heights\, Sainikwadi\, Wadgaonshri;Pune;Maharashtra;411014;India\n" +
此外,为什么要在 属性 中使用无值 "ADDRESS" 参数?请删除它。
"ADR:;;D-100\, Tech Heights\, Sainikwadi\, Wadgaonshri;Pune;Maharashtra;411014;India\n" +
编辑(2015 年 7 月 27 日):
回答您评论中的问题:
要强制解析器将逗号视为普通字符,您可以注册自定义 scribe class,它扩展标准 AddressScribe
scribe 并覆盖其解析函数:
VCardReader reader = new VCardReader(...);
reader.getScribeIndex().register(new AddressScribe() {
@Override
protected Address _parseText(String value, VCardDataType dataType, VCardVersion version, VCardParameters parameters, List<String> warnings) {
String components[] = value.split(";");
int i = 0;
Address property = new Address();
property.setPoBox(next(components, i++));
property.setExtendedAddress(next(components, i++));
property.setStreetAddress(next(components, i++));
property.setLocality(next(components, i++));
property.setRegion(next(components, i++));
property.setPostalCode(next(components, i++));
property.setCountry(next(components, i++));
return property;
}
private String next(String components[], int index) {
if (index >= components.length) {
return null;
}
String next = components[index];
return (next.length() > 0) ? next : null;
}
});