解析 HTML 内容以与 iPhone 应用程序一起使用

Posted

技术标签:

【中文标题】解析 HTML 内容以与 iPhone 应用程序一起使用【英文标题】:Parsing HTML content to use with iPhone app 【发布时间】:2011-12-22 06:59:09 【问题描述】:

我什至不知道这个问题的标题是否合适,因为我真的很迷茫,需要一些建议,一个我需要完成的起点。

我的 iPhone 应用使用我的定制播放器播放来自互联网的音频流。一些链接是来自 Akamai 的实时流,而其他链接是存储在网站上的音频文件。我对直播没问题,但我的问题在于音频文件

由于我有许多存储的音频文件供用户选择,使用不同的语言,我不想在我的应用程序中对所有这些文件进行硬编码。那么我需要一种聪明的方式让用户在应用程序上浏览(从互联网推送信息)直到他到达想要播放的文件。

网站是这样组织的:

首先是列表,包含所有可用的程序。用户选择想要的节目,然后出现另一个页面,他必须选择一周中的哪一天来播放。

我的问题是:如何解析这些内容,以及可供选择的节目和星期几?我应该研究 html 解析吗?有没有更好/更简单的方法,比如在网站上制作 XML 文件?

如果这有帮助,所有网页都以 .aspx 扩展名结尾。

请,来自更有经验的程序员的任何建议都会对我有很大帮助。谢谢!

【问题讨论】:

【参考方案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 月 1 日的节目页面并且他的语言是斯瓦希里语,则将返回两行:

+----------------------------------------------------------------------+
| Filename                        | Language          | Date           |
+----------------------------------------------------------------------+
| kjslfiewofksalfjslfakj          | Swahili           | 2011-11-01     |
| fiwojancanlsjfhkwehwlk          | Swahili           | 2011-11-01     |
+----------------------------------------------------------------------+

您还可以轻松地添加日期和语言的引用来指示 Akamai 记录。它并没有让我觉得非常复杂,但它可能对你来说意味着重大的重新设计。但是,您故意在细节上含糊其辞,因此希望这至少可以为您指明正确的方向。

编辑

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

据我了解,可能有三个类别在起作用:programdatelanguage

如果我创建一个文件结构(假设是 root):

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

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

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

然后,我们所要做的就是读取来自选择器的$_POST 数据以提供节目...不幸的是,这意味着我们必须知道节目播出的日期,然后是语言,然后显示名称。这将是比数据库更糟糕的方式,但可以做到。使用 ASP 读取目录内容,您可以使用循环列出。看起来很简单,但一点也不优雅。

【讨论】:

您好,朋友,感谢您的回答。是的,我不想更具体,但我可以向您发送一封电子邮件,详细说明真实情况。您要我的地址,还是留下您的地址?您的帮助将不胜感激。 我的电子邮件和网站都在我的个人资料中,欢迎您通过其中任何一个与我联系。然而,我的观点是:您正在使用动态脚本语言 (ASP) 来生成页面,那么为什么不充分利用它。要么使用数据库来控制内容,要么相应地组织您的文件结构。重新阅读您的 OP 后,我将创建一个编辑以建议替代文件结构。【参考方案2】:

跳出框框思考:使用 UIWebView

与其思考如何解析数据然后编写 UI 代码来显示数据,不如考虑更多的全局:我们希望向 iPhone 用户呈现屏幕序列以选择和播放录音,这应该会到来从网络服务器。除非有这样的工具......但是等等,有!它被称为网络浏览器,您可以以 UIWebView 的形式将其集成到您的界面中,稍作改动。

首先,添加 UIWebView 非常简单,请查看http://zpasternack.blogspot.com/2010/09/stupid-uialertview-tricks-part-i.html 进行说明。

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

举个例子,首先在你加载的网络视图中说http://foobar.com/somepath/listOfPrograms 这恰好是显示程序列表的网页(感谢一些聪明的 CSS,如果你愿意的话,它看起来就像一个 UITableView)。用户单击一个编程名称,该名称转到http://foobar.com/somepath/programs/CarTalk 哪个页面显示每周节目列表(同样是 iPhonesque 格式),当点击链接时,现在指向http://audio.foobar.com/somesuch/45678913.mp3 此时,您的代码会识别出该音频 URL,从而获得控制权并随心所欲地播放它。

您可能想知道它有多大用处。答案是“非常”:-)。它将演示结构从应用程序移至 Web 服务器。应用程序进入 UIWebView 是初始 URL,退出是点击音频文件链接。几个月后,有人决定他们不希望选择首先是编程名称,然后是星期几;或按语言或国家添加额外的选择层。没问题,不需要发布新版本的应用程序,只需稍微调整一下服务器上的网页,应用程序就会自动获取它。

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

【讨论】:

嗨纳斯!感谢您的回答。我考虑过这一点,甚至尝试使用 UIWebView,这将是一个很好的解决方案。但是该页面显示的菜单很小,因为它不是为 iPhone 格式化的。此外,还有许多其他不必要的链接,并且必须通过 mms:// 播放器重新编程我的自定义 wma。你对这些小菜单有什么建议? iPhone 和/或 iPad 的自定义网页是否需要?再次感谢您。 @Winston:我并不是说你应该使用现有的网站页面(带有小链接、菜单和诸如此类的东西)。您可以设计自己的版本以与完整的浏览器体验并行托管。虽然如果你擅长 CSS - 为什么是的,你可以使用现有的页面,这样它们将为 iPhone 重新格式化并且只显示大菜单而不显示鲤鱼。两者中的任何一个都适合您。我不明白您为什么需要重新编程您的自定义“wma over mms://”播放器。 感谢您的回复,在将我的回复发布给您后,我意识到我确实不需要更换我的播放器,只需稍微修改一下它开始播放的方式。我会和网络程序员谈谈,看看我们可以一起工作什么。谢谢!【参考方案3】:

我也有类似的需求。使用来自 ASP.NET 站点的数据。最后,我使用了 .NET 端的 JSON 并返回 JSON。然后,我使用来自 Google 代码的json-framework 将返回的 JSON 转换为 NSDictionary。剩下的就是历史了。

如果您使用的是 .NET MVC,那么在控制器中返回 JSON 结果非常简单。由于您有 aspx 扩展名,我认为情况并非如此。 json.org 主页底部列出了大量用于 C# 的 JSON 解析器。

【讨论】:

我不是网站管理员。我假设我会制作一个 JSON 文件以由管理员合并到 ASP.NET 代码中,对吗?感谢您的宝贵时间! 提供 JSON 文件肯定是一种方法。网站管理员是否提供了特定格式?如果您可以与网站管理员合作,我会努力向他们发送可以返回搜索列表的内容。 非常感谢您的洞察力!我认为这几乎是要走的路。你愿意看看真实的场景吗?我可以把我的电子邮件留在这里,我可以有你的,给你发送实际的网页。 当然,我很乐意看看它们。 请给我发邮件到 neo-winston@hotmail.com,我会相信的。谢谢。【参考方案4】:

我不认为解析 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,该 UI 可以遍历字典以提供列表节目,然后是每个节目的天数列表,并附有可供选择播放的音频文件。

【讨论】:

非常感谢您的洞察!我认为这几乎是要走的路。你愿意看看真实的场景吗?我可以把我的电子邮件留在这里,我可以有你的,给你发送实际的网页。再次感谢。 这可能是个坏主意,因为数据是单一的,需要下载和解析潜在的巨大文件。假设我有 500 个节目和 500 天的录音,那可能是 250000 个条目 @NasBanov 为什么开发人员不能错开加载机制来解决这个问题?我当然不是建议下载大量数据集。但是,还有多种其他方式可以检索这些请求——通过一些延迟加载或分页结果集。更不用说 JSON 可以在一个小包中提供良好的数据。一旦工作实施到位,您就可以随意调整以提高性能。 @Winston 我想说肯定(我一直很忙,不会每天都回来),但我看到赏金被授予另一位海报。希望你得到一个有效的实现。 感谢您的所有见解和关注!我正在研究 JSON 实现。它似乎非常快速和可靠。【参考方案5】:

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

如果网站内容发生变化,那么我会在服务器上创建一个 XML 文件,您的应用会在启动时(或您认为合适)下载该文件并在应用内进行解析,然后按照静态内容继续。

希望这能让你朝着正确的方向前进。

【讨论】:

您好 Nik,感谢您的回答!实际上,我已经硬编码了英文音频的 URL,当用户做出选择时,相应的音频文件就会相应地播放。但是我有 8 种不同的语言来做同样的事情,那么它很快就会变成一个繁琐的任务。别说我不会说中文也不会说日文,就说两种不同的亚洲语言。 您认为在服务器上使用 TouchXML 和 .xml 文件可以做到吗?我已经在使用 TouchXML 来解析 .asx 文件以按顺序播放各种音频文件。再次感谢您的关注,非常感谢您对此的想法。 您能详细说明一下语言问题吗?如果我理解正确的话。您需要以多种语言将音频文件名本地化给用户。如果您创建带有语言标签的 xml 文件,则应用可以根据设备区域设置使用正确的语言名称。 其实对于每个网页,对于8个不同的成语,我都有很多对应的音频文件。唯一的共同点是网站的设计方式。您需要更多信息吗? 我认为您需要发布服务器信息的布局方式。你提到网站信息没问题,只是服务器?对不起,我很困惑。

以上是关于解析 HTML 内容以与 iPhone 应用程序一起使用的主要内容,如果未能解决你的问题,请参考以下文章

更新为 iPhone 5 制作的 XIB 以与 iPhone 6 和 iPhone 6 Plus 一起使用

如何以与 VBScript 相同的方式解析命令行

无法解析 JSON 数据以与 rxjs 交互

如何以与 iPhoto 相同的方式订购 ALAssetsGroup

JOOQ 解析 orderBy 和 orderDirection 以与 dslcontext 一起使用

$.when 是不是以与数组中相同的顺序解析延迟数组?