Чтение XML

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

oskolok_vatbI
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 112
Зарегистрирован: 07.07.2007 (Сб) 16:13
Откуда: г. Казань

Чтение XML

Сообщение oskolok_vatbI » 18.02.2010 (Чт) 16:18

У меня есть такой xml файл:
Код: Выделить всё
<?xml version="1.0" encoding="cp866"?>
<Tasks>
<Task taskname="задача 53">
    <Measure mName="Основной">
        <Curve cName="ГК" cDest="GKK"/>
        <Curve cName="ЛМ" cDest="LMM"/>
        <Curve cName="СК" cDest="VVV"/>
    </Measure>

    <Measure mName="Контрольный">
        <Curve cName="ГК" cDest="GKK"/>
        <Curve cName="ЛМ" cDest="LMM"/>
        <Curve cName="СК" cDest="VVV"/>
    </Measure>
</Task>

<Task taskname="задача 58">
    <Measure mName="Основной">
        <Curve cName="ГК" cDest="GKK"/>
        <Curve cName="ЛМ" cDest="LMM"/>
        <Curve cName="СК" cDest="VVV"/>
    </Measure>

    <Measure mName="Контрольный">
        <Curve cName="ГК" cDest="GKK"/>
        <Curve cName="ЛМ" cDest="LMM"/>
        <Curve cName="СК" cDest="VVV"/>
    </Measure>

    <Measure mName="ЛПО">
        <Curve cName="ЛМ" cDest="LMM"/>
        <Curve cName="СК" cDest="VVV"/>
     </Measure>
</Task>
</Tasks>


Из него мне нужно заполнить один комбобокс названиями задач (Задача 53 и Задача 58) и после, в зависимости от выбранного его положения заполнять второй комбо названиями замеров (Основной и Контрольный). Заполняю первый и попутно строю дерево:
Код: Выделить всё
    Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim rootNode, subNode1, subNode2, subNode3 As TreeNode
        rootNode = trv.Nodes.Add("Задачи")
        reader = New XmlTextReader(My.Application.Info.DirectoryPath + "\DIC\tasks.xml")
        While reader.Read
            If reader.NodeType = XmlNodeType.Element Then
                If reader.Name = "Task" Then
                    subNode1 = rootNode.Nodes.Add(reader.GetAttribute("taskname"))
                    cmbTask.Items.Add(reader.GetAttribute("taskname"))
                End If
                If reader.Name = "Measure" Then
                    subNode2 = subNode1.Nodes.Add(reader.GetAttribute("mName"))
                End If
                If reader.Name = "Curve" Then
                    subNode3 = subNode2.Nodes.Add(reader.GetAttribute("cName") + " " + reader.GetAttribute("cDest"))
                End If
            End If
        End While
        reader.Close()
    End Sub

А вот обработка переключения первого комбобокса - не работает:
Код: Выделить всё
    Private Sub cmbTask_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmbTask.SelectedValueChanged
        reader = New XmlTextReader(My.Application.Info.DirectoryPath + "\DIC\tasks.xml")
        While reader.Read
            If reader.NodeType = XmlNodeType.Element Then
                If reader.Name = "Task" And reader.GetAttribute("taskname") = cmbTask.SelectedItem.ToString Then
                    'как войти в раздел "Measure" ? Так - не получается.
                    If reader.Name = "Measure" Then
                        dgvColumnType.Items.Add(reader.GetAttribute("cName"))
                    End If
                End If
            End If
        End While
        reader.Close()
    End Sub

Подскажите что нужно поправить ? Как войти в следующий по глубине подраздел ?

natcap
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 234
Зарегистрирован: 25.06.2003 (Ср) 13:15
Откуда: Москва

Re: Чтение XML

Сообщение natcap » 18.02.2010 (Чт) 17:33

Эм.. а почему не работать с XML как с XML полноценным? используя его древовидную структуру, которая вроде как и нужна?
В смысле загрузить его как XML
Код: Выделить всё
dim myXML as  New XmlDocument
dim myPath as string="путь до файла с ХМЛ"
myXML.load(myPath)


Дальше получает список задач:
Код: Выделить всё
Dim myXmlList As XmlNodeList = myXML.GetElementsByTagName("Task")


Ну а дальше - циклы и обращение по номеру в помощь :)
Медленно переезжаю с 6.0 на 2008 .... задавая тонны глупых вопросов :)

oskolok_vatbI
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 112
Зарегистрирован: 07.07.2007 (Сб) 16:13
Откуда: г. Казань

Re: Чтение XML

Сообщение oskolok_vatbI » 19.02.2010 (Пт) 14:57

Если так, то вот такое заполнение первого комбо правильное ?
Код: Выделить всё
        Dim myXML As New XmlDocument
        Dim myPath As String = My.Application.Info.DirectoryPath + "\DIC\tasks.xml"
        myXML.Load(myPath)
        Dim myXmlList As XmlNodeList = myXML.GetElementsByTagName("Task")

        For i = 0 To myXmlList.Count - 1
            cmbTask.Items.Add(myXmlList(i).Attributes("taskname").Value)
        Next

И еще, никак не могу понять, как заполнять второй комбо в зависимости от положения первого. Пробую так, но все равно, все 5 типов замеров попадают.
Код: Выделить всё
        Dim myXmlList As XmlNodeList = myXML.GetElementsByTagName("Task")
        Dim myXmlList1 As XmlNodeList
        For i = 0 To myXmlList.Count - 1
            If myXmlList(i).Attributes("taskname").Value = cmbTask.SelectedItem.ToString Then
                myXmlList1 = myXML.GetElementsByTagName("Measure")
            End If
        Next

        For i = 0 To myXmlList1.Count - 1
            Console.WriteLine(myXmlList1(i).Attributes("mName").Value)
        Next

natcap
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 234
Зарегистрирован: 25.06.2003 (Ср) 13:15
Откуда: Москва

Re: Чтение XML

Сообщение natcap » 19.02.2010 (Пт) 15:18

1 можно и так
2 - замудрил ты сильно...

Код: Выделить всё
        Dim myXmlList As XmlNodeList = myXML.GetElementsByTagName("Task")
       
        dim myTaskNode as As XmlElement = myXmlList(cmbTask.SelectedIndex)
       
        Dim myXmlList1 As XmlNodeList =myTaskNode.GetElementsByTagName("Measure")
       

        For i = 0 To myXmlList1.Count - 1
            Console.WriteLine(myXmlList1(i).Attributes("mName").Value)
        Next


oskolok_vatbI
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 112
Зарегистрирован: 07.07.2007 (Сб) 16:13
Откуда: г. Казань

Re: Чтение XML

Сообщение oskolok_vatbI » 19.02.2010 (Пт) 15:44

Спасибо. Хотя нет, БОЛЬШОЕ спасибо.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList