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()

问题似乎在以下范围内:

对于每个项目作为 System.Xml.XmlElement 在 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 实体的一部分,因此您必须在链接元素中对 url 进行编码,以便 url 的查询参数如下所示(作为示例):

&eventidn=9770

代替:

&eventidn=9770

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

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

于 2012-06-08T21:31:21.460 回答
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
于 2012-06-08T20:00:48.987 回答
0

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

只需检查item不是null并正常执行其余循环即可。

注意:item As System.Xml.XmlElement并不意味着您将XmlElement在循环中仅获得 -s ,而是运行时将尝试将当前 xml 节点转换为XmlElement. 如果这种转换的结果是null,这意味着当前节点不是一个XmlElement并且应该在处理中被跳过。

于 2012-06-08T20:44:22.277 回答