【发布时间】:2013-11-27 02:22:56
【问题描述】:
我正在学习一个大学项目的教程,但遇到了一些障碍,因此非常感谢任何有助于我理解的见解。
我正在尝试编写一个非常简单的 VB 表单客户端/asp.net Web 服务,它允许客户端从服务中读取一些 XML。
在服务上我有以下代码(不包括将 xml 文件加载到服务中的代码)
Private Function getAllPlayList(ByVal userID As String) As XmlElement
Dim root As XmlElement
Dim xPath As String = "//User[starts-with(@ID, '" & userID & "')]"
root = xmlDataPlaylists.DocumentElement.SelectSingleNode(xPath)
Return root
End Function
<WebMethod()> _
Public Function GetPlaylists(ByVal userID As String) As String
Return getAllPlayList(userID).OuterXml
End Function
这似乎在运行服务和调用时起作用,这会产生:
<string xmlns="http://tempuri.org/"> <User ID="B23785"><Playlist ID="Rock"><Song name="Test Song"><Album>Test Album 1</Album><Artist>Test Artist 1</Artist><Title>Test Song 1</Title><Favourite>False</Favourite></Song><Song name="Test Song 2"><Album>Test Album 2</Album><Artist>Test Artist 2</Artist><Title>Test Song 2</Title><Favourite>False</Favourite></Song></Playlist><Playlist ID="POP"><Song name="Test Song"><Album>Rock Album 1</Album><Artist>Rock Artist 1</Artist><Title>Rock Song 1</Title><Favourite>False</Favourite></Song><Song name="Test Song 2"><Album>Rock Album 2</Album><Artist>Rock Artist 2</Artist><Title>Rock Song 2</Title><Favourite>False</Favourite></Song></Playlist></User> </string>
就目前而言,它至少似乎按预期进行。我遇到的麻烦是试图让客户端接收和加载相同的 XML。我的代码是:
Private userID As String
Private playList As Xml.XmlElement
Private service As listService.ServiceSoapClient
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
userID = "B23785"
service = New listService.ServiceSoapClient
getPlaylists()
End Sub
Private Sub getPlaylists()
Dim playListDoc As Xml.XmlDocument
playListDoc = New Xml.XmlDocument()
playListDoc.LoadXml(service.GetPlaylists(userID))
End Sub
问题似乎出在这行:
playListDoc.LoadXml(service.GetPlaylists(userID))
我认为这会将服务返回的字符串值加载到这个新的 XML 文档中。相反,我得到了错误:
XmlReader 必须位于 Element 类型的节点上,而不是 Text 类型的节点上
这让我很困惑,所以如果有人能够阐明为什么这不起作用,我将非常感激!谢谢你的时间
【问题讨论】:
-
调用
service.GetPlaylists(userID)时返回的字符串值是多少? -
听起来该字符串中可能有前导空格,因此是文本节点。您是否考虑过不序列化为字符串?如果您的 Web 方法只返回 XmlElement 或 XmlDocument 怎么办。我认为 WCF 可以将其序列化。
-
@JuanAyala 是正确的,从 Web 服务返回直接 XML 的最合适方法是让您的
WebMethod返回XmlElement、XDocument或XmlDocument。从表面上看,这听起来不对,但序列化程序处理得当。如果您将 XML 作为字符串返回,它必须转义所有 XML 括号和所有增加通信大小的内容。 -
您好,感谢您的建议,我尝试返回 XML 元素而不是字符串,现在我收到一个新错误:错误 1 类型为“System.Xml.Linq.XElement”的值无法转换到“System.Xml.XmlElement”。
-
好的,好消息!得到它的工作,不得不使用这个解决方法:stackoverflow.com/a/6362584/1850552