1

我正在尝试根据复选框的选择构建一个 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>
4

1 回答 1

1

如果您尝试基于多个选中的选择来查询 XML,您应该将选择添加到 a HashSet(aList也可以,但HashSet在这种情况下 a 是更好的选择)。

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
于 2013-10-12T04:33:30.137 回答