0

Web サービスを構築しようとしていますが、既存の XML から新しい XML を構築する必要があります。

コードは次のとおりです。

   <WebMethod(CacheDuration:=0, Description:="GroveHallFromRss")> _
    Public Function GroveHallFromRss() As XmlDocument
        Dim webClient As System.Net.WebClient = New System.Net.WebClient()
        Dim ourUrl As String = "http://123.example.org/RSSSyndicator.aspx?type=N&range=currentyear&expire=Y&location=2-7-165&rssid=18"

    Dim stream AS Stream
    stream = webClient.OpenRead(ourUrl)
    Dim xmlDocument AS XmlDocument = new XmlDocument()
        xmlDocument.Load(stream)


        Dim myXml As XmlDocument = new XmlDocument()
        Using writer As XmlWriter = myXml.CreateNavigator().AppendChild()
            writer.WriteStartDocument()
            writer.WriteStartElement("document")
            For Each item As System.Xml.XmlElement In xmlDocument.Item("item")
                writer.WriteStartElement("event")
                writer.WriteElementString("title", item.Item("title").Value)
                writer.WriteElementString("link", item.Item("link").Value)
                writer.WriteElementString("description", item.Item("description").Value)
                writer.WriteEndElement()
            Next
            writer.WriteEndElement()
            writer.WriteEndDocument()
        End Using

        Return myXml

次のようなエラーが表示されます。

System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。Portal.GroveHallFromRss() で

問題は次の行の周りにあるようです。

For Each item As System.Xml.XmlElement In xmlDocument.Item("item")

しかし、何が原因なのかわかりません。ありがとう!

XML は次のとおりです。

<rss version="2.0">
-
<channel>
-
<title>
title 123
</title>
<cf:treatAs>list</cf:treatAs>
<link>http://123/default.aspx</link>
<description>RSS Feed 123 Events Calendar</description>
-
<item>
<title>New 123 (6/18/2012)</title>
-
<link>
http://123.aspx?view=EventDetails&eventidn=9751&information_id=19501&type=&rss=rss
</link>
-
<description>
<table cellpadding="5" cellspacing="0" border="0"><tr><td valign="top"><table cellpadding="0" cellspacing="0" border="0"><tr><td style="padding-bottom:1px;"><b>Start Date:</b>&nbsp;</td><td style="padding-bottom:1px;">6/18/2012</td><td>&nbsp;<b>Start Time:</b>&nbsp;</td><td>8:00 AM</td></tr><tr><td><b>End Date:</b>&nbsp;</td><td>6/18/2012</td><td>&nbsp;<b>End Time:</b>&nbsp;</td><td>4:00 PM</td></tr></table><br />123<br />Room: 123<br /><br />nil</td></tr></table>
</description>
<pubDate>Mon, 18 Jun 2012 12:00:00 GMT</pubDate>
<category>06/18/2012</category>
</item>
+
<item>
<title>123 Orientation (6/19/2012)</title>
-
<link>
http://123/EventList.aspx?view=EventDetails&eventidn=9770&information_id=19539&type=&rss=rss
</link>
-
<description>
<table cellpadding="5" cellspacing="0" border="0"><tr><td valign="top"><table cellpadding="0" cellspacing="0" border="0"><tr><td style="padding-bottom:1px;"><b>Start Date:</b>&nbsp;</td><td style="padding-bottom:1px;">6/19/2012</td><td>&nbsp;<b>Start Time:</b>&nbsp;</td><td>8:00 AM</td></tr><tr><td><b>End Date:</b>&nbsp;</td><td>6/19/2012</td><td>&nbsp;<b>End Time:</b>&nbsp;</td><td>4:00 PM</td></tr></table><br />123<br />Room: 106<br /><br />nil</td></tr></table>
</description>
<pubDate>Tue, 19 Jun 2012 12:00:00 GMT</pubDate>
<category>06/19/2012</category>
</item>
-
<item>
<title>123 (6/20/2012)</title>
-
<link>
http://123/EventList.aspx?view=EventDetails&eventidn=9789&information_id=19577&type=&rss=rss
</link>
-
<description>
<table cellpadding="5" cellspacing="0" border="0"><tr><td valign="top"><table cellpadding="0" cellspacing="0" border="0"><tr><td style="padding-bottom:1px;"><b>Start Date:</b>&nbsp;</td><td style="padding-bottom:1px;">6/20/2012</td><td>&nbsp;<b>Start Time:</b>&nbsp;</td><td>8:00 AM</td></tr><tr><td><b>End Date:</b>&nbsp;</td><td>6/20/2012</td><td>&nbsp;<b>End Time:</b>&nbsp;</td><td>4:00 PM</td></tr></table><br />123 Grove Hall<br />Room: 106<br /><br />nil</td></tr></table>
</description>
<pubDate>Wed, 20 Jun 2012 12:00:00 GMT</pubDate>
<category>06/20/2012</category>
</item>

</channel>
</rss>
4

3 に答える 3

1

投稿された xml は整形式ではありません。

具体的には、一部のlink要素に無効な文字が含まれています。有効な Xml では、アンパサンド文字 ( &) のみを xml エンティティの一部として使用できるため、link 要素で URL をエンコードして、URL のクエリ パラメータが次のようになるようにする必要があります (例として)。

&eventidn=9770

それ以外の:

&eventidn=9770

Xml 解析規則では、xml パーサーが整形式エラーを致命的なエラーとして処理する必要があるため、XmlDocument オブジェクトは例外をスローする必要があり、ドキュメントを終了し続けることはできません。

他の回答を読むと、リンク要素をまだ読んでいないように見えるので、別の問題もある可能性がありますが、私の言葉をマークしてください。他の問題を修正してください。これはあなたを待っています。本当に運が良ければ、xml は正しくエンコードされており、これはそれを表示するために使用するツールの影響にすぎませんが、これは常にチェックする価値のあるものです。

于 2012-06-08T21:31:21.460 に答える
0

その行で失敗した場合、ほとんどの場合xmlDocument.Item("item")null です。

間違ったノード レベルにいます。ツリーのさらに上の「アイテム」を検索しています。Item() を介してアイテムにアクセスするには、アイテムがアタッチされているノードを取得する必要があります。「rss/channel/item」などのパスを使用できる場合があります。その構文は正確にはわかりません。しかし、それはあなたの問題です。アイテムが接続されているノードレベルではなく、ドキュメントレベルでアイテムを検索しています。1 ターンで 3 ターン離れた場所に到達しようとするようなものです。

お役に立てれば。

編集: XML を XMLDocument にロードし、次のようにアイテムを取得しました:

Sub Main()
    Dim xdoc As XmlDocument

    xdoc = New XmlDocument()
    xdoc.Load(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\test.xml")

    For Each e As XmlElement In xdoc.DocumentElement.SelectSingleNode("channel")
        If e.Name = "item" Then
            MsgBox("I am an item")
        End If
    Next


End Sub
于 2012-06-08T20:00:48.987 に答える
0

反復しているノードの一部は、foreach要素以外のもの (空白など) である可能性があります。人間として、ドキュメント内の他の「技術的」ノードではなく、要素のみを表示します。

itemそうでないことを確認し、null残りのループを通常どおり実行します。

注:ループで -sitem As System.Xml.XmlElementのみを取得するという意味ではありませんが、そのランタイムは現在の xml ノードを にキャストしようとします。そのようなキャストの結果が である場合、それは現在のノードが ではなく、処理をスキップする必要があることを意味します。XmlElementXmlElementnullXmlElement

于 2012-06-08T20:44:22.277 に答える