【问题标题】:Trying to Read an XML String Into a VB.NET DataTable尝试将 XML 字符串读入 VB.NET 数据表
【发布时间】:2020-05-14 22:14:00
【问题描述】:

我有一个基于以下内容的 XML 字符串...

<imsapi>
<status>0</status>
<statusmessage>Login OK</statusmessage>
<zoneresponse>
    <tasks>
        <task>
            <contact>
                <surname>Last Name</surname>
                <givennames>First Name</givennames>
                <userid>JScqTyVQXFwgCg==</userid>
            </contact>
            <contactname>User Name</contactname>
            <org>
                <orgid>JScqTyVRXFQgCg==</orgid>
                <orgname>Business Unit Name</orgname>
            </org>
            <requestdatetime>2019/06/26 08:56:09</requestdatetime>
            <status>Not Started</status>
            <readtaskdatetime>2019/07/04 12:44:08</readtaskdatetime>
            <description>Job description goes here...</description>
            <custon>INTERNAL</custon>
            <duedate>2020/01/13</duedate>
            <lastupdated>2020/01/06</lastupdated>
            <jobnumber>2387</jobnumber>
            <duedatetime>2020/01/13 00:00:00</duedatetime>
            <client>
                <clientid>JScqTyVRXFQgCg==</clientid>
                <clientname>Client Name</clientname>
            </client>
            <taskname>Job Name</taskname>
            <taskid>JiYqUyVRPEslCg==</taskid>
            <lastupdateddatetime>2020/01/06 10:39:44</lastupdateddatetime>
            <requestdate>2019/06/26</requestdate>
            <tasktype>Manufacturing Order</tasktype>
            <substatus>
                <substatusid>IyZaVywK</substatusid>
                <substatus>Not Started</substatus>
            </substatus>
        </task>
      </tasks>
    </zoneresponse>
</imsapi>

我正在将 XML 字符串加载到数据集中以加载到 vb.net 数据网格中。当我运行我的代码时,我收到了一个错误Child list for field task cannot be created,我不知道是什么导致了这个问题以及如何解决它。

我的加载代码是...

dim ds as new DataSet()
ds.ReadXML(New System.IO.StringReader(xmlString))
DataGridView1.DataSource = ds
DataGridView1.DataMember = "task"

XML 正在从 Web 服务器正确加载,因为我可以将其输出到文本字段而没有任何问题,只有当我尝试将其加载到 datagridview 中同时定义任务项是我想要的时才会出现问题显示。

【问题讨论】:

  • ReadXml 不适用于超过 4 级标签的 xml 文件。当您有超过 4 个级别的标签时,您将获得一个带有无法重新组合的碎片表的 DataSet。因此,您必须使用其他 Net 库方法解析 xml。如果您需要支持,我可以提供帮助。

标签: xml vb.net datagridview datasource


【解决方案1】:

您发布的 XML IS 无效,它缺少 tasks 的结束标记。一旦我修复了 XML,下面的代码就会运行。不知道它会产生你期望的结果。

    Dim xe As XElement
    'you could replace the literal assignment with
    '   xe = XElement.Load("path here")
    xe = <imsapi>
             <status>0</status>
             <statusmessage>Login OK</statusmessage>
             <zoneresponse>
                 <tasks>
                     <task>
                         <contact>
                             <surname>Last Name</surname>
                             <givennames>First Name</givennames>
                             <userid>JScqTyVQXFwgCg==</userid>
                         </contact>
                         <contactname>User Name</contactname>
                         <org>
                             <orgid>JScqTyVRXFQgCg==</orgid>
                             <orgname>Business Unit Name</orgname>
                         </org>
                         <requestdatetime>2019/06/26 08:56:09</requestdatetime>
                         <status>Not Started</status>
                         <readtaskdatetime>2019/07/04 12:44:08</readtaskdatetime>
                         <description>Job description goes here...</description>
                         <custon>INTERNAL</custon>
                         <duedate>2020/01/13</duedate>
                         <lastupdated>2020/01/06</lastupdated>
                         <jobnumber>2387</jobnumber>
                         <duedatetime>2020/01/13 00:00:00</duedatetime>
                         <client>
                             <clientid>JScqTyVRXFQgCg==</clientid>
                             <clientname>Client Name</clientname>
                         </client>
                         <taskname>Job Name</taskname>
                         <taskid>JiYqUyVRPEslCg==</taskid>
                         <lastupdateddatetime>2020/01/06 10:39:44</lastupdateddatetime>
                         <requestdate>2019/06/26</requestdate>
                         <tasktype>Manufacturing Order</tasktype>
                         <substatus>
                             <substatusid>IyZaVywK</substatusid>
                             <substatus>Not Started</substatus>
                         </substatus>
                     </task>
                 </tasks>
             </zoneresponse>
         </imsapi>

    Dim ds As New DataSet()
    ds.ReadXml(xe.CreateReader)
    DataGridView1.DataSource = ds
    DataGridView1.DataMember = "task"

【讨论】:

  • 我刚刚更新了缺少结束任务标签的问题。它位于我正在使用的源 XML 字符串中,但不幸的是,我在复制和匿名化 XML 字符串以放入问题时错过了它。在加载 XML 字符串或使用数据集之前,我尝试将 XML 字符串定义为 XElement,但仍然遇到相同的错误。
  • @ChrisRutherfurd-您尝试过我发布的代码吗?它确实在我的机器上工作。
  • 是的,我试过了,我将保存从webClient.DownloadString 方法获得的 XML 的变量传递给 XE,但收到错误消息,说不能将 String 类型的值转换为 XElement,所以我一直在尝试研究如何将字符串解析为 XElement。
  • @ChrisRutherfurd - 你试过 XElement.parse docs.microsoft.com/en-us/dotnet/api/… 吗?
【解决方案2】:

您是否缺少关闭“任务”标签?

我不是 xml 专家,所以我使用了 xml 检查器并得到:

发现错误! XML 文档中的错误: 40: 7 元素类型“tasks”必须以匹配的结束标签“

希望对您有所帮助。

【讨论】:

  • 我在源 XML 字符串上添加了缺失的任务标签,但在复制和匿名问题的字符串时我错过了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
相关资源
最近更新 更多