Получение списка узлов из списка узлов c # .net - PullRequest
3 голосов
/ 02 сентября 2010

Следующий код дает мне нодлист для его перебора:

XPathNavigator thisNavigator = thisXmlDoc.CreateNavigator();
XPathNodeIterator dossierNodes = thisNavigator.Select("changedthisname/dossiers/dossier");

Я обрабатываю этот нодлист, и мне нужно выбрать другой нодлист из этого списка.Я пытаюсь сделать это, используя этот код:

XPathNavigator alineanodesNavigator = dossierNodes.Current;
XPathNodeIterator alineaNodes = alineanodesNavigator.Select("/dossier/alineas/alinea");

Я использую этот код внутри цикла while (dossierNodes.MoveNext ()) и хочу, чтобы этот список узлов был заполнен всеми "allinea's".Однако я не получаю никаких результатов обратно к моему итератору alineaNodes.

Структура документа выглядит следующим образом:

alt text

Как получить узлы Alinea из текущегоузел досье ??

Я отлаживал и получилось:

alt text

    Stream responseStream = response.GetResponseStream();
    StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.UTF8);
    string xml = reader.ReadToEnd();
    XmlDocument thisXmlDoc = new XmlDocument();
    thisXmlDoc.LoadXml(xml);

    XPathNavigator thisNavigator = thisXmlDoc.CreateNavigator();

Ответы [ 5 ]

3 голосов
/ 02 сентября 2010

Правильный полный путь -

changedthisname/dossiers/dossier/alineas/alinea

Итак, если вы сначала выбираете changedthisname/dossiers/dossier, то относительный путь:

alineas/alinea
2 голосов
/ 02 сентября 2010

Вы уже находитесь в узле досье , поэтому, когда вы вводите '/' в начале запроса XPath, вы говорите "Из родительского узла" , что происходитуже быть узлом досье в этой точке.Измените ваш XPath-запрос на:

РЕДАКТИРОВАТЬ:

После просмотра вашего вывода я понимаю свою ошибку.Вам следует просто удалить начальный слеш из исходного запроса.

"Досье / alineas / alinea"

И это должно сработать.

0 голосов
/ 02 сентября 2010

При последнем вызове Select() используйте следующее выражение XPath: "//alinea".

Следующий фрагмент кода перебирает alineas:

        XPathNavigator thisNavigator = doc.CreateNavigator();
        XPathNodeIterator dossierNodes = thisNavigator.Select("//dossier");
        while (dossierNodes.MoveNext())
        {
            XPathNavigator alineanodesNavigator = dossierNodes.Current;
            XPathNodeIterator alineaNodes = alineanodesNavigator.Select("//alinea");

            while (alineaNodes.MoveNext())
            {

            }
        }
0 голосов
/ 02 сентября 2010

Хорошо, я решил это.

Вместо того, чтобы пытаться получить алинеи с помощью xpath, я просто буду использовать SelectDescendants в моем навигаторе узлов, как здесь:

            XPathNavigator alineanodesNavigator = dossierNodes.Current;
            XPathNodeIterator alineaNodes = alineanodesNavigator.SelectDescendants("alinea", "", false);


            List<Alinea> thisAlineaList = new List<Alinea>();
0 голосов
/ 02 сентября 2010

Linq to XML идеально подходит для этого случая.

var alineaNodes = from alinea in XDocument.Load(alldata.xml).Descendents("alinea")
                  select alinea;

, который возвращает IEnumerable со всеми элементами в alldata.xml. Надеюсь это поможет. И действительно посмотрите на Linq, он отлично подходит для этих вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...