Какой метод следует использовать вместо логических элементов в LINQ to XML? - PullRequest
0 голосов
/ 18 августа 2010

Я занимаюсь разработкой мобильного приложения 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 только для узла SECTION, чей ID = 1. Но я получаю весь узел DATAITEM, чей ID СЕКЦИИ 2,3,4,5. Я думаю, что это потому, что я использую Mimic.Descendants («РАЗДЕЛ»). Есть ли другой метод, который может заменить метод Mimic.Descendants ("SECTION"), чтобы я мог получить доступ к узлу DATAITEM только для узла SECTION, чей ID = 1? Можете ли вы предоставить мне код или любую ссылку, с помощью которой я могу решить вышеуказанную проблему

Ответы [ 2 ]

0 голосов
/ 20 августа 2010

Сначала в приведенном выше XML-файле необходимо добавить атрибут 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").Value == SECTION_ID)

проверяет родительский узел, который может быть узлом SECTION или DATAITEMS.Вы должны быть осторожны, чтобы узел SECTION & DATAITEMS имел идентификатор simialr.В этих двух узлах SECTION ID действует как первичный ключ, а DATAITEMS ID действует как внешний ключ.Таким образом, независимо от того, размещены ли данные DATAITEM под узлом SECTION или под узлом DATAITEMS, вышеприведенный запрос находит все необходимые узлы DATAITEM с условием SECTION ID = 1 или любым идентификатором SECTION, который вы хотите указать.

0 голосов
/ 18 августа 2010

Если я правильно понимаю ваш входной XML (так как в приведенном выше примере на самом деле не показаны дочерние элементы DATAITEM, принадлежащие SECTION ID = 1 (только вложенные разделы имеют дочерние элементы DATAITEM), то в вашем запросе LINQ вместо .Descendatns ("DATAITEM"") use:

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

Потомки пройдут по всему поддереву узла, на котором вы их вызываете, и вернут любой элемент с указанным именем, так как ваши разделы являются вложенными, он также просматривает вложенные разделы.

...