JS:解码,过滤和重新附加转义的XML文件

时间:2013-10-08 10:38:12

标签: javascript html xml import filter

我经常访问的其中一个网站将整个电视节目表转义/编码在<script><head>作为txt = '%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%0A%3Cchannel_guide%20operating-unit... 内的第一个项目。他们没有这个时间表的RSS提要,这就是为什么我总是检查它。这个疯狂长代码的第一部分如下:

XML

整个事情是一个巨大的HTML文件。在查看我本地文本编辑器中未转义的位后,我发现我最喜欢的每个节目都有自己独特的5位数系列ID号。此外,我还发现整个计划的XML是动态构建的。

在未转义的<episode code="1336454" recording_type=""> <title>NAME OF EPISODE</title> <description></description> <series id="12345"/> <content-rating>Ratings N/A</content-rating> <duration minutes="120"/> <show-time premiere_type="" live="Repeat"> <eastern hour="22" minute="00"/> <mexico-city hour="21" minute="00"/> <buenos-aries hour="00" minute="00"/> </show-time> </episode> 内,剧集的代码块如下:

<table>

我想做的是......

  1. 使用其唯一的系列ID过滤我想要的节目。
  2. 日期时间系列名称(通过系列ID映射)和剧集名称导出到我网站上的txt - 目前使用Joomla 2.5作为CMS。
  3. 如果有人可以就如何开始或如何实现这一点给我任何建议,我非常感激。我正在尝试使用 Scriptish (Firefox)和 TamperMonkey (Chrome)来尝试执行此任务时编写本地脚本。


    编辑2013年10月9日:我成功制作了Y!管道从外部网站检索XML并将其导入<title> XML元素。可以在此处查看view-source:http://bit.ly/1e7O5pS来源:var showID = { 61189 : 'Show 1', 61190 : 'Show 2', 61393 : 'Show 3', 61395 : 'Show 4', 60486 : 'Show 5', 68253 : 'Show 6' } var k = Object.keys(showID); var n = Object.getOwnPropertyNames(showID); GM_log(k); function loadXMLString(txt) { if(window.DOMParser) { parser=new DOMParser(); xmlDoc=parser.parseFromString(txt,"text/xml"); } else { xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async=false; xmlDoc.loadXML(txt); } return xmlDoc; } if(xmlDoc != 'undefined') { GM_log(xmlDoc); var shows = xmlDoc.getElementsByTagName('series'); GM_log(shows); $(shows).each(function() { var myShows = $.grep(this.id.split(' '), function(value) { return k.indexOf(value) > -1; })[0]; }); } (在地址栏中复制并粘贴以直接转到原始文本)。我之前忘记提到的另一件事是,外部网站有自己的XML解码器脚本。可以在Pastebin上查看解码器源:http://bit.ly/GNdeKu。既然我能够检索信息,我的下一个问题是如何利用外部网站的XML解码器并在我的网站上将我的过滤器合并到其中?非常感谢任何帮助。


    编辑2013年10月9日:在过去的几个小时里,我取得了一些重大进展。这是我作为本地测试人员编写的Grease / TamperMonkey脚本:

    showID

    我遇到的这个问题是,在控制台中,所有节目都显示出来,而不仅仅是具有特定{{1}}的节目。我做错了什么?

1 个答案:

答案 0 :(得分:0)

怎么样

function toDOM(xmlStr) {
  var container = document.createElement("DIV");

  // feel free to remove the XML declaration here
  // replacing /<\?xml.*?\?>/ with the empty string
  container.innerHTML = str;
  return container.firstChild;
}

var txt = '%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%0A%3Cchannel_guide%20operating-unit...';

var dom = toDOM(decodeURIComponent(txt))

var series = dom.querySelectorAll("series[id='12345']")
var episode = series.parentNode;

// and so on

注释

  • 当然,这会使用浏览器的HTML解析器解析您的XML,但除非XML非常复杂(即使用命名空间或类似的东西),否则您应该没问题。
  • querySelectorAll()在较旧的平台上不可用。比较http://caniuse.com/#search=querySelectorAll