sh nasneから取得したxmlを快乐的映射器でパース

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sh nasneから取得したxmlを快乐的映射器でパース相关的知识,希望对你有一定的参考价值。

<?php
/*
 *  Ref : [PHPでnasneの録画情報を取得する - モロ屋](http://text.moroya.net/entry/2013/09/04/234513)
 */

$host = 'xxx.xxx.xxx.xxx'; // nasne IP address
$port = 64230;
$fp = fsockopen($host, $port);

$data = <<<EOM
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <u:X_GetTitleList xmlns:u="urn:schemas-xsrs-org:service:X_ScheduledRecording:2">
         <SearchCriteria />
         <Filter />
         <StartingIndex>0</StartingIndex>
         <RequestedCount>0</RequestedCount>
         <SortCriteria />
      </u:X_GetTitleList>
   </s:Body>
</s:Envelope>
EOM;
$data = str_replace("\n", "\r\n", $data);

$length = strlen($data);

$request = <<<EOM
POST /XSRS HTTP/1.1
HOST: {$host}:{$port}
SOAPACTION: "urn:schemas-xsrs-org:service:X_ScheduledRecording:2#X_GetTitleList"
CONTENT-TYPE: text/xml; charset="utf-8"
Content-Length: {$length}
EOM;
$request = str_replace("\n", "\r\n", $request);

fwrite($fp, $request . "\r\n\r\n" . $data);
ob_start();
fpassthru($fp);
$response = ob_get_clean();
fclose($fp);

$response = explode("\r\n\r\n", $response, 2);

// var_dump($response);
print htmlspecialchars_decode($response[1]);
require 'happymapper'
require 'pp'


class Item
  include HappyMapper

  element :title, String
  element :scheduledStartDateTime, Time
  element :scheduledChannelID, String
  element :desiredQualityMode, Integer
  element :genreID, Integer
  element :reservationCreatorID, Integer
  element :titleProtectFlag, Boolean
  element :titleNewFlag, Boolean
  element :recordingFlag, Boolean
  element :recordDestinationID, String
  element :recordSize, Integer
  element :lastPlaybackTime, Time
  element :portableRecordFile, Integer
end

def not_played(items)
  items.select { |item| item.lastPlaybackTime.is_a?(String) }
end

def played(items)
  items.select { |item| item.lastPlaybackTime.is_a?(Time) }
end

def reject_result_tag(xml)
  xml.gsub(/^.*<Result>/, '')
    .gsub(%r{</Result>.*$}, '')
end

path = File.expand_path('./recordList.xml')
xml = File.read(path)
xml = reject_result_tag(xml)

# p file = REXML::Document.new(file)
# file = Nokogiri::XML::Builder.with(file)
# File.write(File.expand_path('./recordList.xml'), file)
items = Item.parse(xml)
pp items.select { |item| item.title.include?('マギ') }
=begin
[#<Item:0x007f894786ff88
  @desiredQualityMode=100,
  @genreID=112,
  @lastPlaybackTime=2015-04-17 07:36:22 +0900,
  @portableRecordFile=347,
  @recordDestinationID="HDD",
  @recordSize=2531,
  @recordingFlag=false,
  @reservationCreatorID=2000,
  @scheduledChannelID="0x5c38",
  @scheduledStartDateTime=2015-02-06 22:29:47 +0900,
  @title="マギ",
  @titleNewFlag=false,
  @titleProtectFlag=true>,
 #<Item:0x007f89478b11b8
  @desiredQualityMode=100,
  @genreID=112,
  @lastPlaybackTime=2015-03-21 13:19:53 +0900,
  @portableRecordFile=329,
  @recordDestinationID="HDD",
  @recordSize=2475,
  @recordingFlag=false,
  @reservationCreatorID=2000,
  @scheduledChannelID="0x5c38",
  @scheduledStartDateTime=2015-02-13 22:29:47 +0900,
  @title="マギ",
  @titleNewFlag=false,
  @titleProtectFlag=true>,
 #<Item:0x007f89478ee040
  @desiredQualityMode=100,
  @genreID=112,
  @lastPlaybackTime=2015-04-09 03:14:00 +0900,
  @portableRecordFile=346,
  @recordDestinationID="HDD",
  @recordSize=2467,
  @recordingFlag=false,
  @reservationCreatorID=2000,
  @scheduledChannelID="0x5c38",
  @scheduledStartDateTime=2015-04-08 01:04:45 +0900,
  @title="マギ The kingdom of magic",
  @titleNewFlag=true,
  @titleProtectFlag=false>,
 #<Item:0x007f89479b5aa0
  @desiredQualityMode=100,
  @genreID=112,
  @lastPlaybackTime=2015-04-17 07:54:33 +0900,
  @portableRecordFile=328,
  @recordDestinationID="HDD",
  @recordSize=2362,
  @recordingFlag=false,
  @reservationCreatorID=2000,
  @scheduledChannelID="0x5c38",
  @scheduledStartDateTime=2015-04-15 01:04:46 +0900,
  @title="マギ The kingdom of magic",
  @titleNewFlag=false,
  @titleProtectFlag=false>]
=end
#!/bin/sh

php xml_record_list.php > ./recordList.xml

以上是关于sh nasneから取得したxmlを快乐的映射器でパース的主要内容,如果未能解决你的问题,请参考以下文章

SystemTapでMySQL 5.5のDisk I/Oを分析する

ruby twitterで指定ユーザーのツイートを过去200件まで自动取得する。取得したデータは,sqlight3にて保存される。

javascript Vue.jsでEventBusを利用して别にマウントしたコンポーネントやjQueryからイベントを受け取るref:https://qiita.com/inuscript/item

ruby 2015年就职情报サイトから,企业名で検索して绍介ページURLを取得する。

csharp 文字列から长さや,一部分を取得する。半角,全角を区别しない场合はstring.length减で良いが,区别する场合はEncoding.GetByteCountでエンコーディングを使用した

python Python3の的urllibでとあるAPIからJSONを取得したいのですが,そのAPIが高频度で502を返すため的urlopen()をリトライする実装を工夫しています.urllib3は