【问题标题】:Convert XML to VB.NET Dictionary将 XML 转换为 VB.NET 字典
【发布时间】:2012-05-29 18:48:59
【问题描述】:

我正在尝试使用 LINQ 将 XML 中的子子值放入字典集合中。我已经使用与 XML 结构相同但无法搜索特定值的列表和自定义集合来完成此操作。如果我知道 parentName、childName 和 subChildName,我希望能够找到 subChildProperty1.value 和 subChildProperty2.value,而无需遍历整个集合和随后的每个子集合,就像我必须处理列表一样。这可能不是最好的实现,并且愿意接受建议,但仍然想弄清楚如何使其工作。这将允许我有一个字典项:

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)的新手,所以如果我的礼仪不正确,我深表歉意。

【问题讨论】:

    标签: xml vb.net linq dictionary linq-to-xml


    【解决方案1】:

    借助 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 Strict On 和 Option Infer On。)

    【讨论】:

    • 谢谢!我看到“提取属性”部分中的代码正在使用 LINQ,但我从未见过在查询方式之外使用 LINQ。这种技术有什么名字吗?
    • @user1424311:语法xml.&lt;nameOfTag&gt; 称为LINQ to XMLlist.Where(Function(x) ...) 只是写From x In list Where ... 的另一种方式(两者都属于LINQ to Objects)。前者直接使用LINQ的方法(例如Enumerable.Where),而后者使用VB's query operators
    • XDocument.Load 不产生值。
    • 啊,我明白了。我需要顶部的“Imports System.Xml.Linq”(我在上面添加了它)。我的使用 System.Xml.XmlNode.XDocument,其“加载”函数返回值。
    猜你喜欢
    • 2015-07-28
    • 2016-08-17
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 2012-12-06
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多