2012-05-29 65 views
4

我试图从XML中将子子值放入使用LINQ的字典集合中。我已经完成了列表和自定义集合,它们遵循与XML相同的结构,但无法搜索特定的值。如果我知道parentName,childName和subChildName,我希望能够找到subChildProperty1.value和subChildProperty2.value,而不必迭代整个集合和每个后续子集合,因为我必须处理列表。这可能不是最好的实施方式,我很乐于接受建议,但仍想弄清楚如何完成这项工作。那么这将让我有一本字典项是:将XML转换为VB.NET字典

key = "parentNameValue1.childNameValue1.subchildNameValue1.subChildProperty1" 
value = 0 

,我可以只连接字符串,形成一个特定的键以及搜索该键返回一个值。

XML:

<root> 
    <parent> 
     <parentName>parentNameValue1</parentName> 
     <child> 
      <childName>childNameValue1</childName> 
      <subchild> 
       <subchildName>subchildNameValue1</subchildName> 
       <subChildProperty1>0</subChildProperty1> 
       <subChildProperty2>5</subChildProperty2> 
      </subchild> 
      <subchild> 
       <subchildName>subchildNameValue2</subchildName> 
       <subChildProperty1>0</subChildProperty1> 
       <subChildProperty2>10</subChildProperty2> 
      </subchild> 
     </child> 
    </parent> 
<root> 

这个问题有点类似于this question here但我不能让代码在VB中工作了我的申请。

我是新来的SO(和VB),所以如果我的礼节不正确,我很抱歉。

回答

4

用VB.NET的伟大XML的支持,这是很容易做到:

Imports System.Xml.Linq 

... 

Sub Main() 
    Dim xml = _ 
     <root> 
      <parent> 
       <parentName>parentNameValue1</parentName> 
       <child> 
        <childName>childNameValue1</childName> 
        <subchild> 
         <subchildName>subchildNameValue1</subchildName> 
         <subChildProperty1>0</subChildProperty1> 
         <subChildProperty2>5</subChildProperty2> 
        </subchild> 
        <subchild> 
         <subchildName>subchildNameValue2</subchildName> 
         <subChildProperty1>0</subChildProperty1> 
         <subChildProperty2>10</subChildProperty2> 
        </subchild> 
       </child> 
      </parent> 
     </root> 

    ' Alternatively, load XML from a file 
    ' Dim xml = XDocument.Load(fileName) 

    Dim dict As New Dictionary(Of String, Integer) 

    ' Extract the properties 
    For Each parent In xml.<parent> 
     Dim parentName = parent.<parentName>.Value 
     For Each child In parent.<child> 
      Dim childName = child.<childName>.Value 
      For Each subchild In child.<subchild> 
       Dim subchildName = subchild.<subchildName>.Value 
       For Each prop In subchild.Elements.Where(Function(e) e.Name <> "subchildName") 
        dict.Add(String.Format("{0}.{1}.{2}.{3}", parentName, childName, subchildName, prop.Name), _ 
          Integer.Parse(prop.Value)) 
       Next 
      Next 
     Next 
    Next 

    ' Print the values, to show that we've done a good job 
    For Each kv In dict 
     Console.WriteLine("{0}: {1}", kv.Key, kv.Value) 
    Next 
    Console.ReadLine() 
End Sub 

(显然,代码假设选项严格上和Option推断上。)

+0

谢谢!我发现“Extract the properties”部分中的代码使用了LINQ,但我从来没有在查询方式之外看到过使用LINQ。这个技术叫什么名字? – user1424311

+1

@ user1424311:语法'xml。 '被称为[* LINQ to XML *](http://msdn.microsoft.com/zh-cn/library/bb384974.aspx)。 'list.Where(Function(x)...)'是另一种写作方式'From x In list Where ...'(两者都属于* LINQ to Objects *)。前者直接使用LINQ的方法(例如[Enumerable.Where](http://msdn.microsoft.com/en-us/library/bb534803.aspx)),而后者使用[VB的查询操作符](http:///msdn.microsoft.com/en-us/library/bb384504.aspx)。 – Heinzi

+0

'XDocument.Load'不会产生一个值。 – Urbycoz