2011-02-01 7 views
1

Есть ли способ использовать LINQ to XML для запроса XML-документа, подобного приведенному ниже, для создания новых (анонимных или сильно типизированных) объектов из дочерних элементов потомка?Создание объектов из дочерних элементов с использованием LINQ to XML

Вот мой XML документ:

<Root> 
<Rules> 
    <Rule Name="Rule_A"> 
    <Parameter> 
    <Name>Parameter 1</Parameter> 
    <Value>100</Value> 
    </Parameter> 
    <Parameter> 
    <Name>Parameter 2</Parameter> 
    <Value>200</Value> 
    <Parameter> 
    </Rule> 
    <Rule Name="Rule_B"> 
    <Parameter> 
    <Name>Parameter 1</Parameter> 
    <Value>600</Value> 
    </Parameter> 
    <Parameter> 
    <Name>Parameter 2</Parameter> 
    <Value>300</Value> 
    <Parameter> 
    </Rule> 
</Rules> 
</Root> 

Мой LINQ запрос выглядит следующим образом:

Dim RuleName as String = "Rule_A" 
Dim parms() = (From p In pXDoc.Descendants("Rule") _ 
       Where p.Attributes("Name").Any And p.Attribute("Name").Value.Equals(RuleName) _ 
       Select New DataParameter With { _ 
        '' Here is where I would like to pull the values of the Parameter 
        '' elements underneath "Rule_A" and construct an object like below 
        .Name = LINQ magic to get the value of <Name> 
        .Value = LINQ magic to get the value of <Value> 
       }).ToArray 

После выполнения этого запроса, мой Parms() массива будет состоять из двух объектов в нем, представляющих имени/значение от "Parameter 1" и "Parameter 2", которые подпадают под "Rule_A".

Самое близкое, что я смог получить, это использовать p.Element(Parameter).Element(Name).Value, но это не сработает, поскольку я получу только первый элемент Parameter. Я также пробовал использовать Elements(), но не смог понять, как я получу значение каждого из них.

+1

Это XML имеет некоторые проблемы __serious__. –

+0

Ack, вот что я получаю за попытку сэкономить время с помощью Copy/Paste. – Atari2600

ответ

1

Вы можете сделать это следующим образом:

Dim parms() = (From p In pXDoc...<Rule>    _ '' all "Rule" descendants 
       Where [email protected] = RuleName    _ '' "Name" attribute equals RuleName 
       From parm In p.<Parameter>   _ '' all "Parameter" elements 
       Select New DataParameter With   _ 
       {          _ 
        .Name = CStr(parm.<Name>.Value), _ '' value of "Name" element (as string) 
        .Value = CInt(parm.<Value>.Value) _ '' value of "Value" element (as int) 
       }).ToArray 
0
Sub Main() 
    Dim pXDoc As XElement = <Root> 
           <Rules> 
            <Rule Name="Rule_A"> 
             <Parameter> 
              <Name>Parameter 1</Name> 
              <Value>100</Value> 
             </Parameter> 
             <Parameter> 
              <Name>Parameter 2</Name> 
              <Value>200</Value> 
             </Parameter> 
            </Rule> 
            <Rule Name="Rule_B"> 
             <Parameter> 
              <Name>Parameter 1</Name> 
              <Value>600</Value> 
             </Parameter> 
             <Parameter> 
              <Name>Parameter 2</Name> 
              <Value>300</Value> 
             </Parameter> 
            </Rule> 
           </Rules> 
          </Root> 



    Dim RuleName As String = "Rule_A" 
    Dim parms = (From p In pXDoc.Descendants("Rule") _ 
       Where p.Attributes("Name").Any _ 
        And p.Attribute("Name").Value.Equals(RuleName) _ 
       From parm In p.Elements("Parameter") 
       Select New With { _ 
      .Name = parm.Element("Name").Value, 
      .Value = parm.Element("Value").Value 
       }) 
    For Each x In parms 
     Console.WriteLine(x) 
    Next 

    Console.Write("Enter to Exit: ") 
    Console.ReadLine() 
End Sub 

Результат:

{ Name = Parameter 1, Value = 100 } 
{ Name = Parameter 2, Value = 200 } 
Enter to Exit: 
Смежные вопросы