使用变量修改XDocument查询

时间:2013-10-12 04:10:08

标签: 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

    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 个答案:

答案 0 :(得分:1)

如果您尝试根据多个选中的选项查询XML,则应将选择添加到HashSetList也适用,但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