2013-10-12 52 views
1

我想基于复选框的选择来构建一个XDocument查询。使用变量修改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

如果你想查询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 

UPDATE:访问由索引结果直接可以使用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 
+0

如果查询返回3个节点,并且我想引用第二个节点,那么请使用什么语法来执行此操作?显然,在我的语法中选择是错误的'Label1.Text = query.Select(2).Element(“English”)。Value' – Andy

+0

@Andy我更新了我的回复以解决您的问题。 –

+0

谢谢艾哈迈德,太好了。你可以告诉我,我对XML很陌生。检查selectedTypes后面的原因是什么?包含x.Element(“Type”)。Value而不是检查x.Element(“Type”)。Value是否包含selectedTypes?把它写成后者似乎对我更有意义; Contains参数将接受哪些数据类型? – Andy