从XML XDocument(VB.NET)中选择多个值

从XML XDocument(VB.NET)中选择多个值,xml,vb.net,linq,linq-to-xml,Xml,Vb.net,Linq,Linq To Xml,我有一些带有如下标记的XML文件: <?xml version="1.0" encoding="ISO-8859-1"?> <clients> <client id="00000" name="Donald Duck"> <group id="AAA" name="ClientInfo"> <term id="Sex">Male</term> <t

我有一些带有如下标记的XML文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<clients>
    <client id="00000" name="Donald Duck">
        <group id="AAA" name="ClientInfo">
            <term id="Sex">Male</term>
            <term id="Status">In a relationship</term>
        </group>
        <group id="BBB" name="ClientTelephoneNumbers">
            <term id="Home">0000-0000000</term>
            <term id="Cell">1111-1111111</term>
        </group>
        <group id="CCC" name="WorkingStatus">
            <term id="HasAJob">Yes</term>
            <term id="Where">Somewhere</term>
        </group>
    </client>
    <client id="11111" name="Daisey Duck">
        <group id="AAA" name="ClientInfo">
            <term id="Sex">Female</term>
            <term id="Status">In a relationship</term>
        </group>
        <group id="BBB" name="ClientTelephoneNumbers">
            <term id="Home">2222-2222222</term>
            <term id="Cell">3333-3333333</term>
        </group>
        <group id="CCC" name="WorkingStatus">
            <term id="HasAJob">Unknown</term>
            <term id="Where">Unknown</term>
        </group>
    </client>
</clients>
Dim xml As XDocument = Xdocument.Load(ducks.xml)
For Each Duck As XElement in xml.Descendants("client")
    Dim Name As String = Duck.Attribute("Name").Value
Next
我得到鸭子的名字,但假设我想得到手机号码、家庭电话号码和状态,那么我如何从属性等于某个值的元素中获取值

在实际情况中,组ID:s更为复杂,因此我希望不必计算元素,而是通过元素属性来选择它们。像这样:

Dim xml As XDocument = Xdocument.Load(ducks.xml)
For Each Duck As XElement in xml.Descendants("client")
    Dim Name As String = Duck.Attribute("Name").Value
    Dim Cellphone As string = Duck.Element("group WHERE id IS BBB").Element("term WHERE id IS Cell").Value
    Dim Homephone As string = Duck.Element("group WHERE id IS BBB").Element("term WHERE id IS Home").Value
Next
我试过一些问题,但没有真正掌握窍门。有什么建议吗

编辑说明:这不是我在Duck.Element(“blah WHERE blah”)中真正尝试的查询或其他内容,这只是为了描述我想要的…

下面是一个示例:

Dim v = From clt In xml.<client>
        Where clt.@name = "Donald Duck"
        Select cellPhone = clt...<term>.Where(Function(x) x.@id = "Cell").Value,
               homePhone = clt...<term>.Where(Function(x) x.@id = "Home").Value,
               status = clt...<term>.Where(Function(x) x.@id = "Status").Value
Dim v=来自xml格式的clt。
Where clt@name=“唐老鸭”
选择手机=clt…其中(函数(x)x.@id=“Cell”)。值,
homePhone=clt…其中(函数(x)x.@id=“Home”).值,
状态=clt…其中(函数(x)x.@id=“状态”).Value
适用于您的测试用例:

Dim xml = <clients>
            <client id="00000" name="Donald Duck">
              <group id="AAA" name="ClientInfo">
                <term id="Sex">Male</term>
                <term id="Status">In a relationship</term>
              </group>
              <group id="BBB" name="ClientTelephoneNumbers">
                <term id="Home">0000-0000000</term>
                <term id="Cell">1111-1111111</term>
              </group>
              <group id="CCC" name="WorkingStatus">
                <term id="HasAJob">Yes</term>
                <term id="Where">Somewhere</term>
              </group>
            </client>
            <client id="11111" name="Daisey Duck">
              <group id="AAA" name="ClientInfo">
                <term id="Sex">Female</term>
                <term id="Status">In a relationship</term>
              </group>
              <group id="BBB" name="ClientTelephoneNumbers">
                <term id="Home">2222-2222222</term>
                <term id="Cell">3333-3333333</term>
              </group>
              <group id="CCC" name="WorkingStatus">
                <term id="HasAJob">Unknown</term>
                <term id="Where">Unknown</term>
              </group>
            </client>
          </clients>
Dim xml=
男性
恋爱中
0000-0000000
1111-1111111
对
某处
女性
恋爱中
2222-2222222
3333-3333333
不为人知
不为人知
编辑:您可以检查调试器中的
v
是什么:


我想,现在这些东西都存储在“v”中了吧?我现在如何打印手机号码?Console.WriteLine(v.?)?@gubbfett:
v
是对象的集合-请参见我的编辑。可能您可以在那里创建多个对象。当然,在当前的示例中,只有一个。因此,您可以只编写
控制台.WriteLine(v(0).mobile)
。理想情况下,你会有一个循环来检查这个集合。