在 LINQ to XML 中应该使用哪种方法来代替descendants()?

发布于 2024-09-15 02:07:07 字数 2738 浏览 1 评论 0原文

我正在开发 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 查询中,我只想访问 DATAITEM 节点对于 ID=1 的 SECTION 节点。但我得到了 SECTION ID 为 2,3,4,5 的所有 DATAITEM 节点。我认为这是因为我正在使用 Mimic.Descendants("SECTION")。是否有任何其他方法可以替换 Mimic.Descendants("SECTION") 方法,以便我只能访问 ID=1 的 SECTION 节点的 DATAITEM 节点?您能否向我提供可以解决上述问题的代码或任何链接

I am developing asp.net mobile application. I am using XML as a database. I am using the following query for required output. In the XML file I have the collection of MIMIC nodes & inside MIMICS node I have collection of SECTION nodes. One or more more SECTION node contains one or more SECTION nodes ( nested SECTION node) In the SECTION node I have DATAITEM as follows

<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">

For the above XML file I am using following XML query

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;

In the above XML query I want to access the DATAITEM node only for the SECTION node whose ID=1. But I am getting all the DATAITEM node whose SECTION ID is 2,3,4,5. I think it is because I am using the Mimic.Descendants("SECTION"). Is there any other method which can replace the Mimic.Descendants("SECTION") method so that I can access the DATAITEM node only for SECTION node whose ID=1 ? Can you provide me the code or any link through which I can resolve the above issue

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

自我难过 2024-09-22 02:07:07

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

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

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

If I understand your input XML correctly (as the sample above doesn't actually show DATAITEM children belonging to SECTION ID=1 (only the nested sections have DATAITEM children), then in your LINQ query instead of .Descendatns("DATAITEM") use:

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

Descendants will walk the whole subtree of the node you call it on and will return any element with the specified name, since your sections are nested it looks into the nested sections as well.

蓦然回首 2024-09-22 02:07:07

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

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 => e.Parent.Attribute("ID").Value == SECTION_ID)

检查父节点,可以是SECTION 节点或 DATAITEMS 节点。您必须小心节点 SECTION & DATAITEMS 必须具有相似的 ID。在这两个节点中,SECTION ID 充当主键和主键。 DATAITEMS ID 充当外键。因此,无论 DATAITEM 放置在 SECTION 节点下面还是 DATAITEMS 节点下面,上面的查询都会找到条件 SECTION ID=1 或您想要指定的任何 SECTION ID 所需的所有 DATAITEM 节点。

First in the above XML file there is need to add ID attribute to the each node of DATAITEMS & SECTION.
Then use the following query

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;

In the above query the following part

.Descendants("DATAITEM").Where(e => e.Parent.Attribute("ID").Value == SECTION_ID)

checks for the parent node which can be either SECTION node or DATAITEMS node. You must be careful that the node SECTION & DATAITEMS must have the simialr ID. In these two nodes, SECTION ID is acting as the primary key & DATAITEMS ID is acting as a foreign key. Thus whether DATAITEM are placed below SECTION node or below DATAITEMS node, the above query find out all the required DATAITEM node with the condition SECTION ID=1 or any SECTION ID you want to specify.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文