2014-10-27 38 views
0

自從星期五以來,我一直在嘗試搜索解決方案,並且遇到一些問題。VB-LINQ To XML:使用來自複雜Xml文件的匿名類型的嵌套查詢

我有一個XML文件是這樣的:

<?xml version="1.0" encoding="utf-8"?> 
    <ObjectPropertyModule Project="PROJECT NAME" xmlns:dt="urn:schemas-microsoft-com:datatypes"> 
     <Classes> 
      <Class name="class_name_1"> 
       <Objects> 
        <Object name="obj_name_1"> 
         <Properties> 
          <Property name="prop_A" dt:dt="string">value_A1</Property> 
          <Property name="prop_B" dt:dt="string">value_B1</Property> 
         </Properties> 
        </Object> 
        <Object name="obj_name_2"> 
         <Properties> 
          <Property name="prop_A" dt:dt="string">value_A2</Property> 
          <Property name="prop_B" dt:dt="string">value_B2</Property> 
         </Properties> 
        </Object> 
        <Object name="obj_name_3"> 
         <Properties> 
          <Property name="prop_A" dt:dt="string">value_A3</Property> 
          <Property name="prop_B" dt:dt="string">value_B3</Property> 
         </Properties> 
        </Object> 
        <Object name="obj_name_N"> 
         <Properties> 
          <Property name="prop_A" dt:dt="string">value_AN</Property> 
          <Property name="prop_B" dt:dt="string">value_BN</Property> 
         </Properties>        
        </Object> 
       </Objects> 
      </Class> 
      <Class name="class_name_2"> 
      <Objects>...</Objects> 
      </Class> 
      <Class name="class_name_3"> 
      <Objects>...</Objects> 
      </Class> 
     </Classes> 
    </ObjectPropertyModule> 

我需要有匿名對象像這樣的列表:

class_name_1_List() 
el_1 = .Name = "obj_name_1" 
     .prop_A = "vlue_A1" 
     .prop_B = "vlue_B1" 

el_2 = .Name = "obj_name_2" 
     .prop_A = "vlue_A2" 
     .prop_B = "vlue_B2" 

el_N = .Name = "obj_name_N" 
     .prop_A = "vlue_AN" 
     .prop_B = "vlue_BN" 

我試過幾個查詢我得到的最好的,但仍然不工作,是以下內容:

Dim class_name_1_List = _ 
    From el In test...<Class> _ 
    Where [email protected] = "class_name_1" 
    Select New With {.Name = el...<Object>[email protected], _ 
        .prop_A = (From a In el...<Property> _ 
           Where [email protected] = "prop_A" _ 
           Select a.Value), _ 
        .prop_B = (From a In el...<Property> _ 
           Where [email protected] = "prop_B" _ 
           Select a.Value)} 

而我得到的代碼只是一個元素(第一個)的名稱第一個元素的屬性以及每個屬性都包含文件中所有選定屬性的列表。

像這樣:

class_name_1_List.Count = 1 
el(0) = .Name = "obj_name_1" 
     .prop_A ={value_A1, value_A2, value_A3, ..., value_AN} 
     .prop_B ={value_B1, value_B2, value_B3, ..., value_BN} 

是否有人知道我錯了,應該如何正確的查詢得到我需要什麼?

UPDATE:

不斷嘗試,我發現,我想與大家分享的解決方案。無論如何,如果有人知道一些不同或更有效的方法來做到這一點,我會感激任何修復。

Dim class_name_1_list = (From el In test...<Class> _ 
          Where [email protected] = "class_name_1" _ 
          Select From o In el...<Object> _ 
           Select New With {.name = [email protected], _ 
                .prop_A = (From a In o...<Property> _ 
                  Where [email protected] = "prop_A" _ 
                  Select a.Value).First(), _ 
                .prop_B = (From a In o...<Property> _ 
                  Where [email protected] = "prop_B" _ 
                  Select a.Value).First()}).First() 

回答

0

我無法準確找出你之後的結構,所以一旦你能提供一些反饋意見,我很樂意改變它。首先,如果您還沒有它,我建議您抓住LinqPad並將其安裝爲一個簡單的代碼暫存器。

然後在那裏複製以下內容並按F5。 Dump()命令將變量吐出到控制檯。

第一個變量xml採用了可愛的小多串VB.NET招我發現這裏:Multiline strings in VB.NET

dim xml as String = <![CDATA[<?xml version='1.0' encoding='utf-8'?> 
<ObjectPropertyModule Project='PROJECT NAME' xmlns:dt='urn:schemas-microsoft-com:datatypes'> 
    <Classes> 
     <Class name='class_name_1'> 
      <Objects> 
       <Object name='obj_name_1'> 
        <Properties> 
         <Property name='prop_A' dt:dt='string'>value_A1</Property> 
         <Property name='prop_B' dt:dt='string'>value_B1</Property> 
        </Properties> 
       </Object> 
       <Object name='obj_name_2'> 
        <Properties> 
         <Property name='prop_A' dt:dt='string'>value_A2</Property> 
         <Property name='prop_B' dt:dt='string'>value_B2</Property> 
        </Properties> 
       </Object> 
       <Object name='obj_name_3'> 
        <Properties> 
         <Property name='prop_A' dt:dt='string'>value_A3</Property> 
         <Property name='prop_B' dt:dt='string'>value_B3</Property> 
        </Properties> 
       </Object> 
       <Object name='obj_name_N'> 
        <Properties> 
         <Property name='prop_A' dt:dt='string'>value_AN</Property> 
         <Property name='prop_B' dt:dt='string'>value_BN</Property> 
        </Properties> 
       </Object> 
      </Objects> 
     </Class> 
     <Class name='class_name_2'> 
      <Objects>...</Objects> 
     </Class> 
     <Class name='class_name_3'> 
      <Objects>...</Objects> 
     </Class> 
    </Classes> 
</ObjectPropertyModule>]]>.Value 

dim doc as XDocument = XDocument.Parse(xml) 
dim data = From rowClass In doc.Root.Descendants("Class") 
      Select New With { 
       .Name = rowClass.Attribute("name").Value, 
       .Data = From rowObject In rowClass.Descendants("Object") 
         Select New With { 
          .Name = rowObject.Attribute("name").Value, 
          .PropA = rowObject.Descendants("Property").First(Function(d) d.Attribute("name").Value = "prop_A").Value, 
          .PropB = rowObject.Descendants("Property").First(Function(d) d.Attribute("name").Value = "prop_B").Value 
         } 
      } 
data.Dump() 

輸出看起來是這樣的: Linqpad output