none
rssの読み込み RRS feed

  • 質問

  • お世話になっております。
    powershellで、RSSファイルを読み込もうとしているのですが、下記のようなエラーが表示されてしまいます。
    channelの下になにがあるかを見たいのですが、どうしらよいでしょうか。


    c:\>$xml = [xml](gc 'マイクロソフト サイト新着情報.xml')
    c:\>$xml.rss.channel   (ここでリターンキー)

      format-default : メンバ "Item" は既に存在します。

     

    2009年10月14日 7:20

回答

  • OTAKAさん
    質問の意味を勘違いしてしまい申し訳ありません。

    format-default : メンバ "Item" は既に存在します。

    のエラーは、ItemがXmlElement自体のプロパティとして既にあると言うことですよね。


    直接解決に結びつかないかも知れませんが下記のような関数を考えてみました。

    function Get-ElementName([Xml.XmlElement]$element)
    {
        for ( $i = 0; $i -lt $element.get_ChildNodes().Count; $i++ )
        {
            $element.get_ChildNodes().Item($i).Name
        }
    }
     

    上記の Get-ElementNameという関数は、あるElementの下にあるElementの一覧を取得するというものです。

    たとえば

    Get-ElementName $xml.Address.Personal

    とすると、$xml.Address.Personal の下にあるElement名をすべて表示します。Element名は"Item"であっても問題ありません。



    • 回答としてマーク OTAKA 2009年10月21日 8:50
    2009年10月20日 6:42

すべての返信

  • c:\>$xml.rss.channel   (ここでリターンキー)
    上記の部分ですが

    PS> $xml.rss.channel.Item

    としてはどうでしょうか?

    あとは
    PS> $xml = [xml](New-Object System.Net.WebClient).DownloadString("マイクロソフト サイト新着情報.rss")
    PS> $xml.rss.channel.Item

    のような方法でも取得出来ます。


    2009年10月14日 23:38
  • 追記です。

    channelの下に何があるかみたいとのことですが、Itemの下を見れば良いと思います。
    Itemの下に何があるのかを確認するには

    PS> $xml.rss.channel.Item | Get-Member


    のように入力して見てください。メンバ一覧を見ることができます。

    ちなみに、何件のデータがあるのかを確認するには Count プロパティを使用して

    PS> $xml.rss.channel.Item.Count


    と記述することができます。

    またItemは配列ですので、要素番号を指定して、個々のデータにアクセスすることができます

    PS> $xml.rss.channel.Item[0]


    1件目のタイトルを取得したい場合には

    PS> $xml.rss.channel.Item[0].Title


    のようにします。タイトル以外も取得することが可能で、指定可能な項目は、Get-Memberコマンドレットで取得したメンバ一覧を参考にしてください。

    2009年10月14日 23:49
  • [Reflection.Assembly]::LoadWithPartialName("System.ServiceModel.Web")
    $f = New-Object "ServiceModel.Syndication.Rss20FeedFormatter"
    $f.ReadFrom([Xml.XmlReader]::Create(どこかのURL))
    $f.Feed.Items|% {$_.Title.Text}

    う~ん、どうでしょう。.NET Framework 3.5のWCFでRSSのサポートがあります。
    …PowerShellからは扱いづらいですね。
    2009年10月15日 1:15
  • 皆様、ご返事ありがとうございます。

    Itemを見たいのではなくて、Channelの下のエレメントが何があるのかを見るために、

    $xml.rss.channel(リターン)

    をしたかったのですが、エラーがでてしまい困っていたのです。
    極端にいえば、Channelの下にItemのエレメントがなければ、エラーが表示されないので
    Itemエレメントの回避方法があればと思っております。

    ちなみに、
    <?xml version="1.0" encoding="utf-8"?>
    <Address>
      <Personal>
        <Item>a</Item><Item>b</Item>
      </Personal>
    </Address>

    をよみこんで、

    $xml.Address.Personal(リターン)

    format-default : メンバ "Item" は既に存在します。

    となります。

    2009年10月19日 2:09
  • OTAKAさん
    質問の意味を勘違いしてしまい申し訳ありません。

    format-default : メンバ "Item" は既に存在します。

    のエラーは、ItemがXmlElement自体のプロパティとして既にあると言うことですよね。


    直接解決に結びつかないかも知れませんが下記のような関数を考えてみました。

    function Get-ElementName([Xml.XmlElement]$element)
    {
        for ( $i = 0; $i -lt $element.get_ChildNodes().Count; $i++ )
        {
            $element.get_ChildNodes().Item($i).Name
        }
    }
     

    上記の Get-ElementNameという関数は、あるElementの下にあるElementの一覧を取得するというものです。

    たとえば

    Get-ElementName $xml.Address.Personal

    とすると、$xml.Address.Personal の下にあるElement名をすべて表示します。Element名は"Item"であっても問題ありません。



    • 回答としてマーク OTAKA 2009年10月21日 8:50
    2009年10月20日 6:42
  • ご返事ありがとうございます。

    記述していただいたメソッドを、さっそく$profileに登録しました。

    ウェブから取得されるXMLやデータベースで作成されるXMLなどは改行が適度に入っていないので、
    見にくいためXMLNOTEPADを使っていたのですが、powershellのほうが、ちょっと参照するくらいなら
    便利で活用しようと思っていたのですが、以外にItem要素が多くて使えそうもなかったのですが、
    ありがたいです。

    ありがとうございました。
    参考になります。

    2009年10月21日 8:50