0

我有一个网址和端口... mysite.com:8000

当通过 HTTP 接近时,它返回 XML,我需要<title>在树下提取和转换<source mount="/live">

还有其他节点,但层次结构看起来像这样

<icestats>
   <source mount="/live">
      <title>Michael Jackson - Beat IT - Thriller</title>
   </source>
</icestats>

我需要提取<title>使用 Pascal 的值,然后使用第一个连字符将其分解。

因此,如果 XML 具有“Michael Jackson - Beat IT - Thriller”的价值,我需要输出......

艺术家=迈克尔杰克逊歌曲=Beat IT - Thriller

这些需要提取为变量,以包含在脚本的单独部分中。

我很抱歉我还没有在这里尝试过。我是一名学习编程的站内程序员。如果有人能给我一个先机,我可能会充实它。

我在 PAL 中编译它,它基于 Pascal/Delphi 并在 SAM Broadcaster 中运行。

4

2 回答 2

1

我不确定 SAM 或 PAL 是什么,以及它们是否可以使用 Delphi 提供的所有底层技术。

所以我将从德尔福的角度回答这个问题。

你的问题有两个部分:

  1. 通过 HTTP 下载 XML 内容
  2. 将 XML 转换为 Delphi 对象

对于第二部分,使用XML 数据绑定向导。一个很好的演示视频在这里。它依赖于 MSXML DOM。如果没有,您将不得不为自己找到一个 XML 库或自己进行 XML 解析(这可能非常棘手)。

对于第一部分,我将使用 Indy TIdHttp 组件,例如这里问的方式:如何通过 TIdHTTP 下载大文件?

如果 XML 是关于解释 Icecast/Shoutcast 歌曲信息的,那么格式很大程度上取决于流服务器的配置方式(参见http://wiert.me/2010/11/22/streaming-your-mp3-collection-through- an-icecast-server-using-ezstream/)。

icecast 和shoutcast 最酷的地方在于您可以流式传输到它,并且icecast 服务器将确定歌曲信息的表示方式,因此您向流式服务器提供流的实际设备不必担心这一点(我已经一直在流媒体方面)。

于 2013-06-20T13:21:18.513 回答
0

我最终能够非常简单地解决这个问题。首先,我通过将自定义 XSLT 文件添加到服务器(在本例中是 Icecast 服务器)来修饰原始 XML 输出。将它放到 web 文件夹中很简单,但您确实需要访问它。

下面是我用来提取我需要的三个标签的内容。请注意,这是完整的示例,而不是上面简化的示例。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text"/>
    <xsl:template match="/">
        <xsl:value-of select="/icestats/source[@mount='/live']/title" />
      <xsl:text>
</xsl:text>
      <xsl:value-of select="/icestats/source[@mount='/live']/genre" />
      <xsl:text>
</xsl:text>
        <xsl:value-of select="/icestats/source[@mount='/live']/server_name" />
    </xsl:template>
</xsl:stylesheet>

<!-- Do not change the formatting or spacing in this document. It will affect the output and could break processes down the chain -->

然后我简单地使用 delphi(PAL 脚本,SAM 广播器中基于 delphi 的 shell)WebtoFile来创建本地文本文件,并TStringList根据需要存储和解析文本文件到变量。

“ - ”的爆炸是通过posdelete命令的组合实现的。

完整的工作脚本包含很多错误处理,并且太大,无法粘贴到这里。那,和讨论(进一步的背景)可以在这里找到

于 2013-07-29T09:31:08.173 回答