我有一个我为iPhone编写的移动应用程序(Objective-C),允许用户使用特定格式导入数据。我有用Java编写的Android应用程序,我已经让用户开始要求导入功能。数据格式是一种便携式标准,编写此类应用程序的人必须能够导入和导出。
虽然我确实在Objective-C中写了我要问的内容,但我觉得通过不同的方式我可以让我的生活变得更轻松。所以,我想问一下如何在Java中解析以下TLV。我不需要代码,只需要要点。
这是TLV格式:
<Type:Length>Value<Type:Length>Value<Type:Length>Value<end>
每条记录以<
开头,以<end>
结尾。记录内的\ n是可以接受的,零长度值也可以。
这是一个描述四种不同汽车的示例输入,请注意多行记录和零长度值。
<make:4>ford<model:7>contour<color:3>red<end>
<make:5>mazda<model:3>mpv<color:5>black<end>
<make:3>bmw
<model:3>335
<color:6>yellow
<end>
<make:7>unknown<model:0><color:4>grey<end>
解析数据后,我会将其插入到SQLite数据库中,因此最终通过每条记录循环数据将产生一堆字符串,我可以将其用作INSERT语句的一部分。
感谢您提供的任何想法!
尼克
答案 0 :(得分:1)
非常奇怪的格式。是否有已发布的规范?
您可以尝试执行字符串标记化路由。您可以利用内置的Java正则表达式来帮助进行匹配,甚至只使用基本的String类方法(拆分和修剪是您的朋友)。基本上就是这样做:
String[] lines = input.split("<end>");
for(String line : lines)
{
line = line.trim();
String[] sublines = line.split("<");
for(String subline : sublines)
{
subline = subline.trim();
...additional breaking, trimming, branching...
}
}
类型长度是一个有趣的验证组件,但对于现代语言来说有点奇怪。我要问的一个大问题是编码期望的是什么。 UTF-8? 7位ASCII?奇怪的东西?
我的朋友会将伪代码称为hack,并告诉我做JavaCC之类的事情,但我有讨厌和不切实际的朋友。 ;)
答案 1 :(得分:0)
如果输入文件不会太大,您可以将其全部读入String,然后将该字符串拆分为基于<end>
的数组作为分隔符。然后使用正则表达式迭代数组以捕获每个Type
和相应的Value
。
答案 2 :(得分:0)
格式的xmlishness有点令人困惑。长度是令牌的长度吗?我想我会使用以下算法:
next_record:
while (! eof) {
read token between '<' and '>'
if (token == "end") {
continue next_record
}
split token into type and length
read length number of characters into value
add tuplee (type, length, value) to collection
}