为什么在vb.net中构建XML文档时会出现此错误

时间:2012-06-08 19:56:47

标签: xml vb.net

我正在尝试构建一个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()

这个问题似乎与以下几行有关:

  

对于每个项目作为System.Xml.XmlElement在xmlDocument.Item中(&#34;项目&#34;)

但我不确定是什么造成的。谢谢!

这是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>

3 个答案:

答案 0 :(得分:1)

发布的xml格式不正确。

具体而言,某些link元素包含无效字符。有效的Xml只允许&符号(&)作为xml实体的一部分,因此您必须对link元素中的url进行编码,以便url的查询参数看起来像这样(作为示例):

  

&放大器;放大器; eventidn = 9770

而不是:

  

&安培; eventidn = 9770

Xml解析规则需要 xml解析器将格式良好的错误视为致命错误,因此您的XmlDocument对象必须抛出异常并且无法继续完成文档。

阅读其他答案,看起来你还没有阅读任何链接元素,所以你可能还有另一个问题,但是标记我的话:解决其他问题,这个等着你。如果你真的很幸运,xml被正确编码,这只是你用来查看它的任何工具的效果,但这总是值得检查的。

答案 1 :(得分:0)

如果它在该行上失败,则很可能xmlDocument.Item("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

答案 2 :(得分:0)

您在foreach中迭代的某些节点可能是元素之外的其他节点(如空格和其他节点)。作为一个人,你只看到元素而不是文档中的其他“技术”节点。

只需检查item是否为null并正常执行其余操作。

注意:item As System.Xml.XmlElement并不意味着您将只在循环中获得XmlElement - s,但运行时将尝试将当前xml节点强制转换为XmlElement。如果此类投射的结果为null,则表示当前节点不是XmlElement,应在处理时跳过。