2012-06-08 47 views
0

我正嘗試構建Web服務,並且應該使用現有的XML構建新的XML。在vb.net中構建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()

問題似乎是繞的線:

爲每個項目作爲System.Xml.XmlElement在xmlDocument.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> 
+0

發佈XML,它會幫助。 – Yatrix

+0

是的我已經添加了XML,謝謝。 – eastboundr

回答

0

如果它未能在該行,那麼最有可能xmlDocument.Item("item")爲空。

您處於錯誤的節點級別。您正在搜索樹上的「項目」而不是它。您需要獲取項目所連接的節點以通過Item()訪問它。您可能可以使用路徑,例如「rss/channel/item」。不完全確定該語法。但是,這是你的問題,你正在文檔級搜索項目,而不是它所連接的節點級別。這就像試圖在一個回合中得到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 
+0

我可以確認它是那一行,但正如您在XML中看到的那樣,該項目確實存在。不知道爲什麼它仍然在抱怨 – eastboundr

+0

我認識到後來試過xmlDocument.Item(「rss」)。Item(「channel」)。Item(「item」)並且仍然沒有運氣。感謝您的快速回復,雖然... – eastboundr

+0

您是否嘗試過XMLDocument.DocumentElement.SelectSingleNode(「Channel」)。SelectSingleNode(「Item」)以獲得該節點?我仍然認爲這是問題,我們不只是正確地抓住它。 – Yatrix

0

一些你foreach正在迭代的節點可能比元素(如空格等),其他的東西。作爲一個人,你只看到元素,而不看文檔中的其他「技術」節點。

只需檢查item是不是null並正常地執行循環的其餘部分。

注意:item As System.Xml.XmlElement並不意味着您將只在循環中獲得XmlElement -s,但該運行時會嘗試將當前xml節點投射到XmlElement。如果這種鑄造的結果是null,那意味着當前節點不是XmlElement,應該跳過處理。

+0

感謝您的幫助。一個快速更新是我已經設法通過使用「xmlDocument.Item(」rss「)。項目(」頻道「)。項目(」項目「)」,我得到了五個項目,(仍然不是全部)。它現在失敗「item.Item(」標題「)。價值」 – eastboundr

+0

我剛纔在我的評論下面提到。 =) – Yatrix

1

發佈的xml格式不正確。

具體而言,某些link元素包含無效字符。有效的XML只允許符號字符(&)爲XML實體的一部分,所以你必須編碼在鏈接元素的URL,這樣的網址的查詢參數看起來像這樣(作爲一個例子):

&安培; eventidn =代替的9770

& eventidn = 9770

Xml解析規則要求 xml解析器將良構形式錯誤視爲致命錯誤,因此您的XmlDocument對象必須拋出異常並且無法繼續完成文檔。

閱讀其他答案,看起來你還沒有閱讀任何鏈接元素,所以你可能還有其他問題,但標記我的話:修復其他問題,這一個正在等待您。如果你真的很幸運,xml編碼正確,這只是你用來查看它的任何工具的效果,但這是值得檢查的東西。

+0

解釋爲什麼我必須刪除這些才能加載它。我認爲這個XML是有效的。你知道他們對假設的看法...... – Yatrix

相關問題