密码保护 XML-using-URL 到数据集,缺少子节点

Password protected XML-using-URL to Dataset, missing child node

我使用 Linq to Dataset 成功地将密码保护 XML-using-Url(使用 Web 服务)加载到数据集和数据库。我面临的困难之一是子节点数据未从 XML 检索到 ds/dt。 在调试时,我找到了三个数据表(列名)- StuDet(Sid, stuExamId,name, StuGradeId, StCount_id); StCount(SId, year, semester, SubjectTypeId, markCount, StCount_id); SubjectTypeCode(SubjectTypeCode_Id, SubjectTypeId, SubjectTypeCode_Id_0,StCount_id)

使用 URL 将 XML 加载到数据集的代码:

Url = New Uri("http://exapmle.com/StudentFile.xml")
Dim creds As CredentialCache = New CredentialCache
creds.Add(Url, "Basic", New NetworkCredential("userId", "pwd"))
client.Credentials = creds
Dim strm As Stream = client.OpenRead(Url)
Dim strmRdr As StreamReader = New StreamReader(strm)
Dim ds As New DataSet
ds.Locale = System.Globalization.CultureInfo.InvariantCulture
ds.ReadXml(strmRdr)

下面是xml数据:

  <?xml version="1.0" encoding="UTF-8" ?> 
- <StCounts>
- <StCount>
      <SId>3</SId> 
      <year>2014</year> 
      <semester>4</semester> 
      <SubjectTypeId>1</SubjectTypeId> 
      <markCount>95</markCount> 
    - <SubjectTypeCode>
          <SubjectTypeCode>Science</SubjectTypeCode> 
          <SubjectTypeId>1</SubjectTypeId> 
      </SubjectTypeCode>
    - <StuDet>
          <SId>3</SId> 
          <stuExamId>1234567890</stuExamId> 
          <name>Jon Snow</name> 
          <StuGradeId>0</StuGradeId> 
      </StuDet>
  </StCount>
- <StCount>
      <SId>3</SId> 
      <year>2014</year> 
      <semester>4</semester> 
      <SubjectTypeId>2</SubjectTypeId> 
      <markCount>50</markCount> 
    - <SubjectTypeCode>
          <SubjectTypeCode>Math</SubjectTypeCode> 
          <SubjectTypeId>2</SubjectTypeId> 
      </SubjectTypeCode>
    - <StuDet>
          <SId>3</SId> 
          <stuExamId>1234567890</stuExamId> 
          <name>Jon Snow</name> 
          <StuGradeId>0</StuGradeId> 
      </StuDet>
  </StCount>
- <StCount>
      <SId>3</SId> 
      <year>2014</year> 
      <semester>4</semester> 
      <SubjectTypeId>105</SubjectTypeId> 
      <markCount>80</markCount> 
    - <SubjectTypeCode>
          <SubjectTypeCode>History</SubjectTypeCode> 
          <SubjectTypeId>105</SubjectTypeId> 
      </SubjectTypeCode>
    - <StuDet>
          <SId>3</SId> 
          <stuExamId>1234567890</stuExamId> 
          <name>Jon Snow</name> 
          <StuGradeId>0</StuGradeId> 
      </StuDet>
</StCount>
</StCounts>

列 StCount_id、SubjectTypeCode_Id、SubjectTypeCode_Id_0 是在数据表中自动生成的。

我无法将 SubjectTypeCode(科学、数学、历史)获取到数据表 SubjectTypeCode 中。这是为什么?我错过了什么?

任何帮助或引导将不胜感激。谢谢

  • 我能想出的唯一解决办法是创建一个新数据table 使用 SubjectTypeCode 和 SubjectTypeId。
  • 将此数据table 添加到数据集。
  • 使用 Linq to DS 加入数据table 到查询

为了满足好奇心,我测试了一下 SelectSingleNode 中的 SubjectTypeCode。它在那里。

好了,找到核心问题了。在示例 XML 中,查看 SubjectTypeCode 如何既是父项又是子项。所以我将外部节点重命名为 SubjectTypeCodes。现在数据表正在填充 SubjectTypeCode(Science, math, history) 列。

解决我问题的代码:

Dim nodeList As XmlNodeList = xmlDoc.SelectNodes("/StCounts/StCount")
        For Each node As XmlNode In nodeList
            Dim oldNode As XmlNode = node.SelectSingleNode("SubjectTypeCode")
            Dim newNode As XmlNode = xmlDoc.CreateElement("SubjectTypeCodes")
            newNode.InnerXml = oldNode.InnerXml

            node.InsertBefore(newNode, oldNode)
            node.RemoveChild(oldNode)
        Next

数据集现在有一个包含列 StCount_id、SubjectTypeCode_Id、SubjectTypeCode 的数据表。