Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чередование Nodes в XML 
:(
    Опции темы
rucan
Дата 25.2.2008, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 12.4.2007

Репутация: нет
Всего: нет



Не могу решить никак задачу
Выбираю из Xml необходимые узлы и вывожу их в ListBox

Код

System.Xml.XPath.XPathNodeIterator iterator1 = nav.Select("config/set/a");
            System.Xml.XPath.XPathNodeIterator iterator2 = nav.Select("config/set/b");
            while (iterator1.MoveNext())
             listBox1.Items.Add(iterator1.Current);
            while (iterator2.MoveNext())
             listBox1.Items.Add(iterator2.Current);

         
Как правильно сделать, чтобы данные узлов чередовались
a1
b1
a2
b2
a3
b3
А у меня они так выводятся:
a1
a2
a3
b1
b2
b3


Это сообщение отредактировал(а) rucan - 25.2.2008, 18:14
PM MAIL   Вверх
Aline
Дата 26.2.2008, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Если количество узлов одинаковое можно попробовать вывести через цикл For

Что-то типа:

For( i =0; i < количество; ++i){
    iterator1.MoveNext();
    listBox1.Items.Add(iterator1.Current);
    iterator2.MoveNext();
    listBox1.Items.Add(iterator2.Current);
}

Это сообщение отредактировал(а) Aline - 26.2.2008, 09:56
PM MAIL   Вверх
Alexsar
Дата 29.2.2008, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.5.2005

Репутация: 2
Всего: 1



у меня была аналогичная проблема, только число внутренних узлов ноды <CLIENT> переменное
проблема решается, если использовать обход всех элементов, а внутренние<CLIENT> считать как корневые для IP, DIR..
вот xml
Код

<?xml version="1.0"?>
<!-- This is a sample XML document -->
<ELEMENT>
  <PORT>7070</PORT>

<CLIENT>
  <IP>192.168.222.1</IP>

  <DIRINPUT>C:\multi\in1\</DIRINPUT>
  <DIRINPUT>C:\multi\in2\</DIRINPUT>
  <DIROUTPUT>C:\multi\out1\</DIROUTPUT>
  </CLIENT>


<CLIENT>

<IP>192.168.243.1</IP>

  <DIRINPUT>C:\mult\1\</DIRINPUT>
  <DIRINPUT>C:\mult\2\</DIRINPUT>
  <DIROUTPUT>C:\mult\o1\</DIROUTPUT>
  <DIROUTPUT>C:\mult\o2\</DIROUTPUT>
  
</CLIENT>

</ELEMENT>




код заполняет некоторый объект, вот код класса объекта

Код

    class ClassXML
    {
        public int PORT;
        public ArrayList ClientsXML;
        public ClassXML()
        {
            ClientsXML = new ArrayList();
        }
        public int ControlIP(string ipAddr)
        {
            int index = 0;
            for (index = 0; index < ClientsXML.Count; index++)
            {
                if (((ClientXML)ClientsXML[index]).IP == ipAddr)
                    return index;
            }
            return -1;
        }
    }

    class ClientXML
    {
        public string IP;
        public ArrayList DIRINPUT;
        public ArrayList DIROUTPUT;
        public ClientXML()
        {
            DIRINPUT = new ArrayList();
            DIROUTPUT = new ArrayList();
        }
    }


вот код заполнения
Код

XmlDocument doc = new XmlDocument();
                doc.Load(path);
                XmlNode root = doc.DocumentElement;

                foreach (System.Xml.XmlNode childnode in root.ChildNodes)
                {
                    if (childnode.LocalName == "PORT")
                    {
                        confXml.PORT = int.Parse(childnode.InnerText.ToString());
                        continue;
                    }
                    ClientXML cl = new ClientXML();
                    foreach (XmlNode child in childnode.ChildNodes)
                    {

                        switch (child.LocalName)
                        {
                            case "IP":
                                {
                                    cl.IP = child.InnerText.ToString();
                                    break;
                                }
                            case "DIRINPUT":
                                {
                                    cl.DIRINPUT.Add(child.InnerText.ToString());
                                    cl.DIRINPUT.TrimToSize();
                                    break;
                                }
                            case "DIROUTPUT":
                                {
                                    cl.DIROUTPUT.Add(child.InnerText.ToString());
                                    cl.DIRINPUT.TrimToSize();
                                    break;
                                }
                        }
                    }
                    if (cl.IP != null)
                    {
                        confXml.ClientsXML.Add(cl);
                        confXml.ClientsXML.TrimToSize();
                    }
                }



если потом вывести на печать confXml, получишь желаемый результат, то есть поле ClientsXML будет массив объетов класса  ClientXML, каждый из которых будет отображать внутреннюю структуру отдельной ноды <CLIENT>

ну а дальше заполняй листбокс smile 
PM MAIL   Вверх
rucan
Дата 4.3.2008, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 12.4.2007

Репутация: нет
Всего: нет



Я вот сделал так и все чередуется как надо.
Код

XmlDocument doc;
            DataSet ds = new DataSet("XML");
            ds.ReadXml(@"C:\Test\test.xml");
            dataGridView1.DataSource = ds.Tables[0];
            ds.Tables[0].DefaultView.Sort = "name";
            doc = new XmlDataDocument(ds);
            XmlNodeList nodeLst = doc.GetElementsByTagName("name");
            XmlNodeList nodeLst2 = doc.GetElementsByTagName("phone");
            for (int ctr = 0; ctr < nodeLst.Count; ctr++)
            {
                listBox1.Items.Add(nodeLst[ctr].InnerText);
                listBox1.Items.Add(nodeLst2[ctr].InnerText);
            }


Здесь я в строчке
Код

ds.Tables[0].DefaultView.Sort = "name";

Сортирую данные по столбцу "name" и хочу вывести в  listBox1 отсортированно по столбцу "name".
Но вывод в listBox1 происходит без сортировки.
Как можно вывести в  listBox1 отсортированно по поле "name"?

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0445 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.