将HTML内容解析以在iPhone应用程序中使用

3
我甚至不知道这个问题的标题是否合适,因为我真的很迷茫,需要一些建议和指导,以便开始完成我的任务。
我的iPhone应用程序使用自定义播放器从互联网流式传输音频。有些链接是来自Akamai的直播流,而其他链接则是存储在网站上的音频文件。我对直播流感到满意,但是我的问题在于音频文件。
由于我有许多存储的音频文件供用户选择,涵盖不同的语言,我不想在应用程序中硬编码所有这些文件。因此,我需要一种聪明的方式让用户在应用程序中浏览(从互联网推送信息),直到他找到要播放的文件。
该网站的组织结构如下:
首先有一个列表,列出所有可用的节目。用户选择所需的节目,然后出现另一页,他必须选择要播放的一周中的某一天。
我的问题是:我该如何解析这个内容,包括可以选择的节目和每周的日期?我应该研究HTML解析吗?是否有更好/更简单的方法,例如在网站上制作XML文件?
如果有帮助的话,所有网页的扩展名都是.aspx。
请任何有经验的程序员给我一些建议,将非常有帮助。谢谢!
5个回答

2
我不认为在这里解析HTML是最佳实现方式。选择一个有结构的源,而无需担心解析或完全忽略可视标记(这也意味着将更少的资源用于解析标记,因为您只会解析相关内容)。
我建议使用可以转换为NSDictionary或其他数据结构以供应用程序使用的XML或JSON源。这是一个将XML源转换为NSDictionary的小巧类:http://troybrant.net/blog/2010/09/simple-xml-to-nsdictionary-converter/ TBXML是另一个轻量级的Objective-C XML解析器,使自定义数据对象的实现取决于您:http://www.tbxml.co.uk/ 如果您希望使用JSON,则有许多帮助程序可用。开始寻找的好地方是这里:http://cocoaobjects.com/?s=json 如果我正确理解了您的问题,无论您选择什么样的源,您都希望最终获得一个类似于以下内容的字典对象:
programs = (
  {
    program_name: "Foo";
    tracks = (
      { day: Monday;
        track: audio_file1.mp3;
      },
      { day: Tuesday;
        track: audio_file2.mp3;
      },
      { day: Wednesday;
        track: audio_file3.mp3;
      }
    );
  },
  {
    program_name: "Bar";
    tracks = (
      { day: Monday;
        track: audio_file4.mp3;
      },
      { day: Tuesday;
        track: audio_file5.mp3;
      },
      { day: Wednesday;
        track: audio_file6.mp3;
      }
    );
  },
  {
    program_name: "Baz";
    tracks = (
      { day: Monday;
        track: audio_file7.mp3;
      },
      { day: Tuesday;
        track: audio_file8.mp3;
      },
      { day: Wednesday;
        track: audio_file9.mp3;
      }
    );
  };
);

一旦您确定了数据源并将其转换为本地数据对象以在Obj-C中使用,您就可以继续编写用户界面(UI)的代码,该界面可以迭代字典以提供程序列表,并为每个节目提供一周的列表,其中包含可选择播放的音频文件。请保留HTML标签。

非常感谢您的见解!我认为这基本上是正确的方法。您是否愿意看一下真实场景?我可以在此留下我的电子邮件,也可以获取您的电子邮件,以便向您发送实际的网页。再次感谢。 - neowinston
这可能是个不太好的想法,因为数据是单块且需要下载和解析潜在的巨大文件。假设我有500个程序和500天的记录,那就可能会有250000条目。 - Nas Banov
@NasBanov 为什么开发人员不会分阶段加载机制来解决这个问题呢?我当然不是建议下载大量数据集。然而,还有多种其他方式可以检索这些请求——通过一些惰性加载或分页结果集。更不用说 JSON 可以在小包中传递良好的数据了。一旦实现了一个工作的实现,你就可以随意调整以提高性能。 - bobwaycott
@Winston 我本来想说没问题(我很忙,不可能每天都回来),但是我看到赏金已经被授予给另一个帖子的发布者了。希望你能得到一个可行的实现。 - bobwaycott
感谢您的所有见解和关注!我正在开发一个JSON实现。它似乎非常快速和可靠。 - neowinston

2
我有类似的需求。从一个ASP.NET网站获取数据。最终我使用了来自.NET方面的JSON并返回JSON。然后,我使用了谷歌代码中的json-framework将返回的JSON转换为NSDictionary。从那里开始就没什么问题了。
如果您正在使用.NET MVC,则在控制器中返回JSON结果非常简单。由于您有aspx扩展名,我假设情况并非如此。在json.org主页底部列出了大量C#的JSON解析器。

我不是网站管理员。我假设我会制作一个 JSON 文件,由管理员将其合并到 ASP.NET 代码中,是这样吗?谢谢您的时间! - neowinston
提供一个JSON文件肯定是一种方法。网站管理员提供了特定的格式吗?如果您可以与网站管理员合作,我会尝试向他们发送一些内容,以便他们可以返回一个搜索列表。 - uadrive
非常感谢您的见解!我认为这基本上是正确的方法。您是否愿意看一下实际情况?我可以在此留下我的电子邮件,也可以获取您的电子邮件,以便向您发送实际的网页。 - neowinston
当然,我很乐意查看它们。 - uadrive
请发送邮件至neo-winston@hotmail.com,我会回复的。谢谢。 - neowinston
如果你仔细想想,甚至不需要使用JSON或XML - 列表可以以纯文本形式提供(Web服务器将很乐意以纯文本形式提供),并在\n上解析,这是微不足道的。 - Nas Banov

1
如果是我,假设我对你所说的有一些线索,我会建立一个数据库来显示音频内容和日期之间的关系。然后,内容的旋转器只需通过查询进行更新…
例如,假设有一个表格…
+----------------------------------------------------------------------+
| Filename                        | Language          | Date           |
+----------------------------------------------------------------------+
| kjslfiewofksalfjslfakj          | Swahili           | 2011-11-01     |
| shfaahflajfewifhlanfww          | Guyanese          | 2011-10-08     |
| weijalfjlajfljalsfjewn          | French            | 2011-11-01     |
| fiwojancanlsjfhkwehwlk          | Swahili           | 2011-11-01     |
| fhalksflwiehlfnaksflhw          | Swahili           | 2011-11-03     |
+----------------------------------------------------------------------+

好的,所以如果joe schmo到达了日期为2011-11-01的节目页面,并且他的语言是斯瓦希里语,将返回两行:
+----------------------------------------------------------------------+
| Filename                        | Language          | Date           |
+----------------------------------------------------------------------+
| kjslfiewofksalfjslfakj          | Swahili           | 2011-11-01     |
| fiwojancanlsjfhkwehwlk          | Swahili           | 2011-11-01     |
+----------------------------------------------------------------------+

您还可以轻松地添加日期和语言的引用,以指示 Akamai 记录。这对我来说并不是非常复杂,但可能意味着您需要进行重大的重新设计。然而,您在细节上故意含糊不清,所以希望至少能为您指明正确的方向。

编辑

好的,在重新阅读后,可能有一种相对简单的方法可以通过使用目录结构来控制内容的组织,但它要让位于我的建议表格。

据我了解,可能有三个类别正在起作用:程序日期语言

如果我创建一个文件结构(假设根目录):

/public_html/audio/[date]/[language]/[program_name].mp4

然后,当用户选择日期和语言时,我们可能会有:

/public_html/audio/2011-11-14/swahili/the_linux_show.mp4

然后,我们所要做的就是读取选择器中的$_POST数据以提供展示...不幸的是,这意味着我们必须知道演出播出的日期、语言和节目名称。这比使用数据库要糟糕得多,但是可以完成。使用ASP读取目录内容,您可以使用循环进行列表。看起来非常简单,但并不优雅。

嗨朋友,感谢你的回答。是的,我不想过于具体,但我可以给你发送一封电子邮件详细说明真实情况。你想要我的地址,还是在这里留下你的地址?非常感谢你的帮助。 - neowinston
我的电子邮件和网站都在我的个人资料中,欢迎您通过任何一种方式与我联系。然而,我的观点是:您正在使用动态脚本语言(ASP)来生成页面,那么为什么不充分利用它呢?可以使用数据库来控制内容,或者相应地组织文件结构。在重新阅读您的原始帖子后,我将创建一个编辑建议另一种文件结构。 - stslavik

1

如果网站内容是静态的,我会在应用程序中硬编码文件名和适当的URL,并让用户滚动浏览可用项目列表。

如果网站内容发生改变,那么我会在服务器上创建一个XML文件,在应用程序启动时(或者根据您的需求)下载并在应用程序中解析,然后按照静态内容继续操作。

希望这能为您指明正确的方向。


嗨Nik,感谢你的回答!实际上,我已经将英语音频的URL硬编码,当用户做出选择时,相应的音频文件会播放。但是我有8种不同的语言要做同样的事情,这将很快变成一项繁琐的任务。更不用说我既不会讲中文也不会日语,只是提到两种不同的亚洲语言。 - neowinston
您是否认为可以使用TouchXML和服务器上的.xml文件来完成此操作?我已经在使用TouchXML解析.asx文件以便按顺序播放各种音频文件。再次感谢您的关注和期待您宝贵的意见。 - neowinston
实际上,对于每个网页的8种不同语言版本,我都有许多相应的音频文件。唯一共同之处就是网站的设计方式。您需要更多信息吗? - neowinston
Nik,你想让我把网站链接发给你,这样你就可以自己看了吗?我可以在这里放上我的电子邮件地址,然后你给我发一封电子邮件,我会回复详细信息。谢谢! - neowinston
太好了!我正在向您发送一条消息,非常感谢您的关注,并感谢您分享您的知识。 - neowinston
显示剩余2条评论

1

打破常规思维:使用UIWebView

我们可以不用考虑如何解析数据并编写UI代码来显示它,而是从更大的角度考虑:我们想向iPhone用户呈现一系列屏幕以选择和播放录音,并且这些应该来自Web服务器。如果有这样的工具就好了...但是等等,有了!它叫做Web浏览器,通过UIWebView的形式,您可以将其集成到您的界面中,只需稍微改变一下即可。

首先,添加UIWebView非常容易,请参阅此链接http://zpasternack.blogspot.com/2010/09/stupid-uialertview-tricks-part-i.html进行说明。

所以,假设我们已经添加了Web视图,用户可以从中选择音频文件,那么接下来会发生什么?原来你可以告诉它应该发生什么,查看这个问题UIWebView open links in Safari。您可以将您的代码挂钩到链接单击的处理中,并做任何您想做的事情(例如隐藏Web视图并显示播放器等)。

举个例子,在网页视图中首先加载:
http://foobar.com/somepath/listOfPrograms
它是一个显示程序列表的网页(如果您愿意,由于某些巧妙的 CSS,它可能看起来像 UITableView)。 用户单击节目名称,将转到
http://foobar.com/somepath/programs/CarTalk
该页面呈现每周节目的列表(再次类似于 iPhone 格式),并且当单击链接时,现在指向
http://audio.foobar.com/somesuch/45678913.mp3
此时,您的代码识别出这是音频 URL,获取控制权并以任何喜欢的方式播放。

你可能会想这有什么用处。答案是"非常" :-). 它将演示结构从应用程序中移开,转移到Web服务器上。应用程序进入UIWebView的初始URL,退出时点击音频文件链接。几个月后,有人决定他们不希望选择首先按编程名称再按星期几进行,或者通过语言或国家添加额外的选择层。没问题,无需发布新版本的应用程序,只需稍微调整一下服务器上的网页,应用程序就会自动获取它。

它还使测试Web服务器端变得容易 - 只需将任何浏览器指向初始页面URL并单击即可查看是否可以访问到可行的音频文件。Web管理员可以独立处理,与您作为应用程序编写者无关。您甚至不必关心他们在其侧面使用什么来获取这些页面,是在HTML中硬编码的,还是来自SQL DB、XML陷阱等等。


嗨Nas!谢谢你的回答。我已经考虑过这个问题,甚至尝试使用UIWebView,这将是一个很好的解决方案。但是页面显示的菜单很小,因为它没有为iPhone格式化。此外,还有许多其他不必要的链接,我必须重新编程我的自定义wma over mms://播放器。关于这些小菜单,你有什么建议?是否需要为iPhone和/或iPad创建自定义网页?再次感谢。 - neowinston
@Winston:我并不是说你应该使用现有的网站页面(带有小链接、菜单等等)。你可以设计自己的版本,与完整浏览器体验并行托管。虽然如果你擅长CSS——那么,是的,你可以以这样的方式使用现有页面,使它们重新格式化为iPhone,并仅显示大菜单而无需任何垃圾。两者中的任何一个都适合你。我不明白为什么你需要重新编写你的自定义"wma over mms://"播放器。 - Nas Banov
非常感谢您的答复,发完我的答案后,我意识到我不需要更换我的播放器,只需要稍微修改一下它开始播放的方式。我将与网络程序员交谈,看看我们可以一起做些什么。谢谢! - neowinston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接