如何在带有前缀的XElement中获取没有前缀的子XElements

时间:2012-11-23 08:27:56

标签: vb.net linq-to-xml

我一直在使用VB.net中的XML,这与你在C#中的方式有​​很大的不同, 它接缝更自然地遍历节点。然后,您会遇到命名空间。

首先,我使用了以下导入:

Imports <xmlns:mstns="http://tempuri.org/myDataSet.xsd">
Imports <xmlns="http://tempuri.org/MyDataSet.xsd">
Imports <xmlns:xs="http://www.w3.org/2001/XMLSchema">
Imports <xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
Imports <xmlns:msprop="urn:schemas-microsoft-com:xml-msprop">

然后我尝试像这样访问TableAdapter节点:

  Dim doc As XDocument

  Dim tableAdapters As XElement

  doc = XDocument.Load(file.FullName)

 tableAdapters = (From item As XElement In doc.<xs:schema>.
                                               <xs:annotation>.
                                               <xs:appinfo>.
                                               <DataSource>. 
                                               <Tables>.
                                               <TableAdapter>
                                               Select item).FirstOrDefault()

[忽略换行符,我只是为了可读性而这样做]

我可以正确地获取节点,直到xs:appinfo,之后,我尝试检索的任何节点都为空

我做错了什么?

以下是数据集的正常xml结构:

XML structure of a normal dataset

1 个答案:

答案 0 :(得分:0)

没关系,我已经发现了问题。 DataSource节点没有使用前缀命名空间,但实际上它实际上是使用命名空间AS AN ATTRIBUTE 。你可以在图像中看到(作为xmlns)。

所以要解决它,你喜欢这样:

添加另一个导入,其命名空间为xmlns,在节点中找到属性:

Imports <xmlns:datasource="urn:schemas-microsoft-com:xml-msdatasource">

然后像这样检索:

        tableAdapters = (From item As XElement In doc.<xs:schema>.
                                                     <xs:annotation>.
                                                     <xs:appinfo>.
                                                      <datasource:DataSource>.
                                                    <datasource:Tables>.
                                                    <datasource:TableAdapter> 
                          Select item).FirstOrDefault()