我正在尝试根据复选框的选择构建一个XDocument查询。
我有以下代码,这是无效的,因为我不确定所需的语法。我认为它正在努力实现的目标相当明显;这几乎就是我在SQL之前构造Where语句的方式。最终代码中将有大约16个复选框,这是使用多个If语句的原因。
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>
答案 0 :(得分:1)
如果您尝试根据多个选中的选项查询XML,则应将选择添加到HashSet
(List
也适用,但HashSet
是更好的选择在这种情况下)。
Dim selectedTypes As New HashSet(Of String)
If NounCheckbox.Checked Then
selectedTypes.Add("noun")
End If
If AdjectiveCheckbox.Checked Then
selectedTypes.Add("adjective")
End If
Dim query = From x in WordDictionary.Root.Elements("Word")
Where selectedTypes.Contains(x.Element("Type").Value)
Select x
更新:要直接通过索引访问结果,您可以使用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)
。
Label1.Text = results(1).Element("English").Value