在LINQ to XML中应该使用哪种方法而不是descendants()?

时间:2010-08-18 13:56:07

标签: c# asp.net xml linq-to-xml lambda

我正在开发asp.net移动应用程序。我使用XML作为数据库。我正在使用以下查询所需的输出。在XML文件中,我有MIMIC节点的集合&在MIMICS节点内我有SECTION节点的集合。一个或多个SECTION节点包含一个或多个SECTION节点(嵌套的SECTION节点)在SECTION节点中,我有DATAITEM如下

<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”)方法,以便我只能访问ID = 1的SECTION节点的DATAITEM节点?您能否提供我可以解决上述问题的代码或链接

2 个答案:

答案 0 :(得分:0)

如果我正确理解您的输入XML(因为上面的示例实际上并未显示属于SECTION ID = 1的DATAITEM子级(只有嵌套的部分具有DATAITEM子级),那么在您的LINQ查询中而不是.Descendatns(“DATAITEM” “)使用:

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

后代将遍历您调用它的节点的整个子树,并将返回具有指定名称的任何元素,因为您的部分是嵌套的,它也会查看嵌套部分。

答案 1 :(得分:0)

首先在上面的XML文件中,需要将ID属性添加到DATAITEMS&amp;的每个节点。部分。 然后使用以下查询

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”)。where(e =&gt; e.Parent.Attribute(“ID”)。Value == SECTION_ID)

检查父节点,该节点可以是SECTION节点或DATAITEMS节点。你必须小心节点SECTION&amp; DATAITEMS必须具有simialr ID。在这两个节点中,SECTION ID充当主键&amp; DATAITEMS ID充当外键。因此,无论DATAITEM位于SECTION节点下方还是DATAITEMS节点下方,上述查询都会找出条件SECTION ID = 1或您要指定的任何SECTION ID所需的所有DATAITEM节点。