Vb.net 使用变量修改XDocument查询
我正试图根据复选框的选择构造一个XDocument查询 我有下面的代码,它不工作,因为我不确定所需的语法。我认为这是相当明显的,它试图实现什么;这几乎就是我以前在SQL中构造Where语句的方式。最终的代码中将有大约16个复选框,这就是使用多个If语句的原因Vb.net 使用变量修改XDocument查询,vb.net,visual-studio-2010,linq,linq-to-xml,Vb.net,Visual Studio 2010,Linq,Linq To Xml,我正试图根据复选框的选择构造一个XDocument查询 我有下面的代码,它不工作,因为我不确定所需的语法。我认为这是相当明显的,它试图实现什么;这几乎就是我以前在SQL中构造Where语句的方式。最终的代码中将有大约16个复选框,这就是使用多个If语句的原因 Private Sub NextWord_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NextWord.Click D
Private Sub NextWord_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NextWord.Click
Dim WordDictionary As XDocument = XDocument.Load("Dictionary Resources\Dictionary.xml")
Dim CheckSelection As String
If NounCheckbox.Checked = True Then
CheckSelection = CheckSelection & "noun"
End If
If AdjectiveCheckbox.Checked = True Then
CheckSelection = CheckSelection & "adjective"
End If
Dim ToList = From x In WordDictionary.Root.Elements("Word") Where x.Elements("Type").Value = CheckSelection
For Each result In ToList
Console.WriteLine(result)
Next
End Sub
为完整起见,XML文件具有以下结构:
<?xml version="1.0" encoding="utf-8"?>
<Root>
<Word ID="1">
<Type>adjective</Type>
<English></English>
<Thai></Thai>
<Meaning></Meaning>
<Audio>Dictionary Resources\Sound Files\1.wav</Audio>
<Picture></Picture>
<Transliteration></Transliteration>
</Word>
...
...
</Root>
形容词
字典资源\声音文件\1.wav
...
...
如果试图基于多个选中的选择查询XML,则应将选择添加到哈希集
(列表
也可以,但在这种情况下,哈希集
是更好的选择)
更新:要直接按索引访问结果,您可以使用query.ElementAt(1)
,但如果您计划按索引访问不同的项目,这并不是性能方面的最佳选择。您应该使用列表来代替。您可以通过使用Dim results=query.ToList()
设置一个新变量,或按如下方式更改查询:
Dim results = (From x in WordDictionary.Root.Elements("Word")
Where selectedTypes.Contains(x.Element("Type").Value)
Select x).ToList()
现在您已经有了一个列表,您可以通过其索引访问项目。索引是从零开始的,因此要访问列表中的第二项,应该使用results(1)
如果试图基于多个选中的选择查询XML,则应将选择添加到
哈希集
(在这种情况下,列表
也可以,但哈希集
是更好的选择)
更新:要直接按索引访问结果,您可以使用query.ElementAt(1)
,但如果您计划按索引访问不同的项目,这并不是性能方面的最佳选择。您应该使用列表来代替。您可以通过使用Dim results=query.ToList()
设置一个新变量,或按如下方式更改查询:
Dim results = (From x in WordDictionary.Root.Elements("Word")
Where selectedTypes.Contains(x.Element("Type").Value)
Select x).ToList()
现在您已经有了一个列表,您可以通过其索引访问项目。索引是从零开始的,因此要访问列表中的第二项,应该使用results(1)
如果查询返回3个节点,并且我想引用第二个节点,那么我将使用什么语法来执行此操作?显然,我语法中的select是错误的
Label1.Text=query.select(2).Element(“English”).Value
谢谢Ahmad,太好了。可以看出,我对XML非常陌生。检查selectedTypes.是否包含x.Element(“Type”).值而不是检查x.Element(“Type”).值是否包含selectedTypes.背后的原因是什么?把它写成后者对我来说似乎更有意义;是否仅仅取决于Contains参数将接受的数据类型?@Andy的想法是您有多个类型,它们被添加到selectedTypes
。把它想象成一个装满我们感兴趣的各种物品的袋子。我们用它来过滤我们得到的任何东西。它必须存在于我们的“袋子”中才能被接受。当我们检查x.Element(“Type”).Value时,它返回一种类型。我们根据选择的类型检查该类型。如果存在,则返回true
,否则返回false
。你不能撤消支票。。。没有“字符串”的概念。存在于(选定类型)
。是的,通过使用HashSet
或List
类型,我们使用Contains
方法进行检查。如果查询返回3个节点,我想引用第二个节点,我将使用什么语法来执行此操作?显然,我语法中的select是错误的Label1.Text=query.select(2).Element(“English”).Value
谢谢Ahmad,太好了。可以看出,我对XML非常陌生。检查selectedTypes.是否包含x.Element(“Type”).值而不是检查x.Element(“Type”).值是否包含selectedTypes.背后的原因是什么?把它写成后者对我来说似乎更有意义;是否仅仅取决于Contains参数将接受的数据类型?@Andy的想法是您有多个类型,它们被添加到selectedTypes
。把它想象成一个装满我们感兴趣的各种物品的袋子。我们用它来过滤我们得到的任何东西。它必须存在于我们的“袋子”中才能被接受。当我们检查x.Element(“Type”).Value时,它返回一种类型。我们根据选择的类型检查该类型。如果存在,则返回true
,否则返回false
。你不能撤消支票。。。没有“字符串”的概念。存在于(选定类型)
。是的,通过使用HashSet
或List
类型,我们使用Contains
方法进行检查。
Label1.Text = results(1).Element("English").Value