在VB中查询XML文档时出现问题

时间:2014-01-07 11:47:57

标签: xml vb.net

我在VB项目中第一次使用XML。我一直在研究这个查询3个小时并阅读它,但我没有运气,我认为我真的不明白具体的术语,以使这个查询与我的文档一起正常工作。

问题是我一直没有返回并导致崩溃。我现在已经把代码弄得太乱了,它可能比我写的原始数据要少,但你应该能够获得要点,看到任何有XML经验的人都可能会感到痛苦!这只是我的偏好的一部分,它为不同版本的Access存储了正确的提供程序,并允许用户在程序交付后添加更多版本。这是代码,它的价值。

在这里,我想找到'string'的值,其中版本的'name'等于“Access 2010”的测试值

Dim xml As XDocument = XDocument.Load("preferences.xml")
    Dim query = From xe In xml.Descendants("Accessversion")
        Where xe.Element("Version").Attribute("Name") = "Access 2010"
        Select xe.Element("string").Value

这是XML文档的相关部分:

<Preferences>

  <AccessVersion>
    <Version>
        <Name>Access 97</Name>
        <string>Provider=Microsoft.Jet.OLEDB.4.0</string>
    </Version>
    <Version>
        <Name>Access 2000</Name>
        <string>Provider=Microsoft.Jet.OLEDB.4.0</string>
    </Version>
    <Version>
        <Name>Access 2002</Name>
        <string>Provider=Microsoft.Jet.OLEDB.4.0</string>
    </Version>
    <Version>
        <Name>Access 2003</Name>
        <string>Provider=Microsoft.Jet.OLEDB.4.0</string>
    </Version>
    <Version>
        <Name>Access 2007</Name>
        <string>Provider=Microsoft.ACE.OLEDB.12.0</string>
    </Version>
    <Version>
        <Name>Access 2010</Name>
        <string>"Provider=Microsoft.ACE.OLEDB.12.0"</string>
    </Version>
    <Version>
        <Name>Access 2013</Name>
        <string>Provider=Microsoft.ACE.OLEDB.12.0</string>
    </Version>
  </AccessVersion>

同样,我意识到这可能不是应用XML的最佳方式,但我必须在大约一个小时内学习这个项目的一部分。你可能会说,我对编程非常陌生,项目的其余部分已经很好了,但这真让我难过!

2 个答案:

答案 0 :(得分:0)

Dim xml As XDocument = XDocument.Load("preferences.xml")
Dim query = From xe In xml.Descendants("Version")
            Where xe.Element("Name").Value = "Access 2010"
            Select xe.Element("string").Value

答案 1 :(得分:0)

为了明确您的查询有什么问题,以下是您的方法的正确版本:

Dim query = From xe In xml.Descendants("Accessversion")
        Where xe.Element("Version").Element("Name").Value = "Access 2010"
        Select xe.Element("Version").Element("string").Value

请注意,.Descendants将搜索当前代码下的所有元素。并且.Element将仅搜索当前元素的直接子元素。请注意,在这种情况下xe<Accessversion>标记。

但无论如何,@ Iomed的答案是更好/更简单的方法