2010-08-18 67 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") 

后人将带您上称之为节点的整个子树,并返回任何元素与指定名称,因为您的部分嵌套它也查看嵌套部分。