Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Чередование Nodes в XML


Автор: rucan 25.2.2008, 18:13
Не могу решить никак задачу
Выбираю из 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

Автор: Aline 26.2.2008, 09:55
Если количество узлов одинаковое можно попробовать вывести через цикл For

Что-то типа:

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

Автор: Alexsar 29.2.2008, 21:57
у меня была аналогичная проблема, только число внутренних узлов ноды <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 

Автор: rucan 4.3.2008, 15:45
Я вот сделал так и все чередуется как надо.
Код

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)