密码保护 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 的数据表。
我使用 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 的数据表。