你会如何用Java解析这个TLV?

时间:2011-07-09 05:11:48

标签: java

我有一个我为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语句的一部分。

感谢您提供的任何想法!

尼克

3 个答案:

答案 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
}