文系SEの月報

個人でやったことを細々と。

ポッドキャストの取得

ポッドキャストサイトのRSSXMLで取得し、各号の音声ファイルを一度に取得する。
とりあえず、XMLを取得する。

/*using System.Xml;*/
public XmlDocument GetRSSXML(string readPath)
{
    XmlDocument xmlDocument = new XmlDocument();
    try
    {
   //readPathのURLでXMLを取得する。
        xmlDocument.Load(readPath);
        xmlData.Document = xmlDocument;
    }
    catch (System.IO.IOException ioex)
    {
        throw ioex;
    }
    catch (XmlException xex)
    {
        throw xex;
    }
    catch (Exception exc)
    {
        throw exc;
    }
    return xmlDocument;
}

音声ファイルの場所は、ItemタグのEnclosureタグの中にあったので、
XmlNodeListクラスを駆使して、Itemタグのデータを取得する。
(今回はすべてのItemタグのデータを取得する。)

/*using System.Xml;*/
public XmlNodeList GetNodeListItem(XmlDocument argXmlDocument)
{
    XmlNodeList nodeListRss = argXmlDocument.Document.SelectNodes("rss");
    XmlNodeList nodeListChannel = nodeListRss.Item(0).SelectNodes("channel");
    XmlNodeList nodeListItem = nodeListChannel.Item(0).SelectNodes("item");
    return nodeListItem;
}

最後に、EnclosureタグのURLを取得すればOKだが、URLがEnclosureタグのなかに入り込んでしまっている。
こんな感じ↓

<enclosure type="audio/mpeg" length="0000" url="https://XXXXX.net/image/XXXXX.mp3"/>

今回は、一度EnclosureタグをHTMLのなかに入れて、GetElementsByTagNameで引っ張り出す方法を使用してみる。

/*using System.Windows.Forms;*/
public string GetPodcastURL(XmlNode node/*XmlNodeListをForEachして取得*/)
{
    WebBrowser documentText = new WebBrowser();
    documentText.DocumentText = "";
    HtmlDocument doc = documentText.Document.OpenNew(true);
    XmlNodeList enclosureListItem = node.SelectNodes("enclosure");
    doc.Write("<html><body>" + node.SelectNodes("enclosure")[0].OuterXml + "</body></html>");
    HtmlElementCollection htmlElement = doc.GetElementsByTagName("enclosure");
    string PodcastURL = htmlElement[0].GetAttribute("url");
    return PodcastURL;
}

以上で取得ができた。