Fazer uma PerguntaFazer uma Pergunta
 

Respondidorssの読み込み

  • quarta-feira, 14 de outubro de 2009 7:20OTAKA Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     

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


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

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

     

Respostas

  • terça-feira, 20 de outubro de 2009 6:42HIROsDotNetMVPMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     Respondido
    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"であっても問題ありません。



    • Marcado como RespostaOTAKA quarta-feira, 21 de outubro de 2009 8:50
    •  

Todas as Respostas

  • quarta-feira, 14 de outubro de 2009 23:38HIROsDotNetMVPMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     Contém Código
    c:\>$xml.rss.channel   (ここでリターンキー)
    上記の部分ですが

    PS> $xml.rss.channel.Item

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

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

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


    • EditadoHIROsDotNetMVPquarta-feira, 14 de outubro de 2009 23:39改行挿入
    •  
  • quarta-feira, 14 de outubro de 2009 23:49HIROsDotNetMVPMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     Contém Código
    追記です。

    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コマンドレットで取得したメンバ一覧を参考にしてください。

    • EditadoHIROsDotNetMVPquarta-feira, 14 de outubro de 2009 23:50文章修正
    •  
  • quinta-feira, 15 de outubro de 2009 1:15佐祐理 Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     
    [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からは扱いづらいですね。
  • segunda-feira, 19 de outubro de 2009 2:09OTAKA Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     
    皆様、ご返事ありがとうございます。

    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" は既に存在します。

    となります。

  • terça-feira, 20 de outubro de 2009 6:42HIROsDotNetMVPMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     Respondido
    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"であっても問題ありません。



    • Marcado como RespostaOTAKA quarta-feira, 21 de outubro de 2009 8:50
    •  
  • quarta-feira, 21 de outubro de 2009 8:50OTAKA Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     

    ご返事ありがとうございます。

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

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

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