2010-08-18 35 views
0

我正在開發asp.net移動應用程序。我使用XML作爲數據庫。我正在使用以下查詢來獲取所需的輸出。在XML文件中,我擁有MIMICS節點集合&在MIMICS節點中,我有SECTION節點的集合。一個或多個更多SECTION節點包含一個或多個部分的節點(嵌套SECTION節點)將部分節點我的DataItem如下應該用哪種方法代替LINQ to XML中的後代()?

<MIMIC ID="3" NAME="Network Status"> 
       <SECTIONS> 
        <SECTION ID="1" NAME="SDA Server 1" HAS-SUBSECTIONS="TRUE"> 
      <DATAITEM NAME="ABC">XYZ</DATAITEM> 
         <SECTION ID="2" NAME="Top Side"> 
          <DATAITEMS> 
           <DATAITEM>Not Available</DATAITEM> 
          </DATAITEMS> 
         </SECTION> 
         <SECTION ID="3" NAME="Subsea" HAS-SUBSECTIONS="TRUE"> 
          <SECTION ID="4" NAME="SDA"> 
           <DATAITEMS> 
            <DATAITEM NAME="SEMA"> 
             <ATTRIBUTE NAME="TYPE" VALUE="?" APPEND-TAG-NAME-BY ="?"/> 
             <ATTRIBUTE NAME="TagName" VALUE="?"/> 
             <ATTRIBUTE NAME="OPCTagName" VALUE="?"/> 
            </DATAITEM> 
            <DATAITEM NAME="SEMB"> 
             <ATTRIBUTE NAME="TYPE" VALUE="?" APPEND-TAG-NAME-BY ="?"/> 
             <ATTRIBUTE NAME="TagName" VALUE="?"/> 
             <ATTRIBUTE NAME="OPCTagName" VALUE="?"/> 
            </DATAITEM> 
           </DATAITEMS> 
          </SECTION> 
          <SECTION ID="5" NAME="Manifolds" HAS-SUBSECTIONS="TRUE"> 

對於上述XML文件我使用下面的XML查詢

string MIMIC_ID = "3"; 
string SECTION_ID = "1"; 



var QueryResultSet = from Mimic in FieldRoot.Element("USER-INTERFACE-DEFINITION").Element("MIMICS").Descendants("MIMIC") 
           .Where(e => e.Attribute("ID").Value == MIMIC_ID) 
           from DataItem in Mimic.Descendants("SECTION") 
           .Where(e => e.Attribute("ID").Value == SECTION_ID) 
           .Descendants("DATAITEM") 
           select DataItem; 

在上述XML查詢中,我只想爲ID = 1的SECTION節點訪問DATAITEM節點。但是我得到了SECTION ID爲2,3,4,5的所有DATAITEM節點。我認爲這是因爲我正在使用Mimic.Descendants(「SECTION」)。有沒有其他方法可以替代Mimic.Descendants(「SECTION」)方法,以便我可以僅訪問IDIT爲1的SECTION節點的DATAITEM節點?你能提供我的代碼或任何鏈接,通過我可以解決上述問題

回答

0

首先在上面的XML f ile需要將ID屬性添加到DATAITEMS & SECTION的每個節點。 然後使用以下查詢

var QueryResultSet = from Mimic in FieldRoot.Element("USER-INTERFACE-DEFINITION").Element("MIMICS").Descendants("MIMIC") 
            .Where(e => e.Attribute("ID").Value == MIMIC_ID) 
            from DataItem in Mimic.Descendants("SECTION") 
            .Where(e => e.Attribute("ID").Value == SECTION_ID) 
            .Descendants("DATAITEM").Where(e => 
            e.Parent.Attribute("ID").Value == SECTION_ID) 
            select DataItem; 

在上述查詢的以下部分

.Descendants( 「DataItem的」)。如果(E => e.Parent.Attribute( 「ID」)。值= = SECTION_ID)

檢查可以是SECTION節點或DATAITEMS節點的父節點。您必須小心節點部分& DATAITEMS必須具有simialr ID。在這兩個節點中,SECTION ID充當主鍵& DATAITEMS ID充當外鍵。因此,無論DATAITEM放置在SECTION節點還是在DATAITEMS節點下面,上述查詢都會找到所有需要的DATAITEM節點,並使用條件SECTION ID = 1或您要指定的任何SECTION ID。

0

如果我正確理解您的輸入XML(因爲上面的示例實際上並沒有顯示屬於SECTION ID = 1的DATAITEM子項(只有嵌套部分有DataItem的孩子),然後在您的LINQ查詢,而不是.Descendatns(「DataItem的」)使用方法:

.Element("DATAITEMS").Elements("DATAITEM") 

後人將帶您上稱之爲節點的整個子樹,並返回任何元素與指定名稱,因爲您的部分嵌套它也查看嵌套部分。

相關問題