【问题标题】:.LoadXML "The XmlReader must be on a node of type Element"?.LoadXML“XmlReader 必须位于元素类型的节点上”?
【发布时间】: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

标签: asp.net xml vb.net


【解决方案1】:

在 wcf 服务(vanilla Visual Studio 模板)中,我创建了这个 Web 服务

    public XmlElement testme()
    {
        XmlDocument doc = new XmlDocument();
        doc.LoadXml("<foo><bar name=\"hello\"/></foo>");

        string xpath = "//bar";
        XmlElement e = doc.DocumentElement.SelectSingleNode(xpath) as XmlElement;
        return e;
    }

在一个控制台应用程序中,我创建了一个普通服务引用,并调用了该服务

        Service1Client c = new Service1Client();
        XElement e = c.testme();

这几乎是 SOAP 跨网络并将 XmlElement 转换为 XElement,因为 XElement 是 MS xml api 的下一个化身,这就是 VS Web 服务代码生成器所做的。

所以你可以这样做并收工,对不起我的 C#,我没有 hablo VB :-D

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2022-11-01
  • 2019-11-20
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 2019-02-09
  • 1970-01-01
相关资源
最近更新 更多