Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Импорт XML файла в Visual Basic 2010 (http://forum.oszone.net/showthread.php?t=235907)

neo21 03-06-2012 23:24 1927518

Импорт XML файла в Visual Basic 2010
 
Доброго времени суток.
Есть XML файл:

Код:

<?xml version="1.0" encoding="windows-1251"?>
<document>
  <data>
    <next1>777</next1>
    <next2>888</next2>
    <next3>999</next3>
          <next4 ROWNUM="1">1</next4>
        <next4 ROWNUM="2">2</next4>
        <next4 ROWNUM="3">3</next4>
        <next4 ROWNUM="4">4</next4>
  </data>
 </document>

С помощью программы:

Код:


Код:

Imports System.Xml
Imports System.Data

Public Class Form1
#Region "XML"
    Public Shared Function EmptyStringToNull(ByVal o As String) As Object
        Dim ret As Object = DBNull.Value
        Try
            If o.Trim.Length = 0 Then
                ret = DBNull.Value
            Else
                ret = o
            End If
        Catch ex As Exception

        End Try
        Return ret
    End Function
    Private Sub ReadXMLFile()
        Dim xmlDoc As New System.Xml.XmlDocument
        Dim root As XmlElement = Nothing
        Dim nodes As XmlNodeList = Nothing
        Dim node As XmlNode = Nothing
        Dim xmlFile As String = ""
        Try
            OpenFileDialog1.ShowDialog()
            xmlFile = OpenFileDialog1.FileName
            xmlDoc.Load(xmlFile)
            root = xmlDoc.DocumentElement
            nodes = root.SelectNodes("//document/data") 'The XMLPath
            Me.DataGridView1.Rows.Clear() 'Clear Grid
            For Each node In nodes
                Me.DataGridView1.Rows.Add(EmptyStringToNull(node("next1").InnerText), EmptyStringToNull(node("next2").InnerText), EmptyStringToNull(node("next3").InnerText), EmptyStringToNull(node("next4").InnerText))
            Next
        Catch ex As Exception

        End Try
    End Sub
#End Region
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ReadXMLFile()
    End Sub

End Class

Я загружаю данные из XML файла в DataGridView1.
Как сделать, чтобы в столбец next4 грузились все данные:
Код:

<next4 ROWNUM="2">2</next4>
<next4 ROWNUM="3">3</next4>
<next4 ROWNUM="4">4</next4>


Delirium 04-06-2012 07:30 1927603

Цитата:

Цитата neo21
в столбец next4 грузились все данные: »

Т.е. в одну ячейку все 4 данных? или как? Покажи на примере Excel, каким ты хочешь видеть результат.

neo21 04-06-2012 10:26 1927642

Цитата:

Цитата Delirium
Покажи на примере Excel, каким ты хочешь видеть результат. »


LilLoco 04-06-2012 12:02 1927703

Чтобы так отобразить, необходимо определить количество записей next4. И потом в цикле добавлять строки. Причем на первой итерации добавить все данные (next1,next2,next3,next4(1 значение)), а на последующих итерациях добавлять только лишь строки с данными из next4.

neo21 04-06-2012 12:26 1927719

Цитата:

Цитата LilLoco
а на последующих итерациях добавлять только лишь строки с данными из next4 »

Не пойму как добавить строки с данными из next4
Куда ставить:
ROWNUM="2"
ROWNUM="3"
ROWNUM="4"

LilLoco 04-06-2012 12:55 1927737

Если не сложно и не секретно можно выложить проект и *.xml файл? Будет проще разобраться =)

neo21 04-06-2012 13:22 1927749

LilLoco, Так он есть
Цитата:

Цитата neo21
Код:
<?xml version="1.0" encoding="windows-1251"?>
<document>
<data>
<next1>777</next1>
<next2>888</next2>
<next3>999</next3>
<next4 ROWNUM="1">1</next4>
<next4 ROWNUM="2">2</next4>
<next4 ROWNUM="3">3</next4>
<next4 ROWNUM="4">4</next4>
</data>
</document> »

Могу файлом загрузить.

LilLoco 04-06-2012 13:23 1927750

Еще бы сам проект =) Чтобы не писать код самостоятельно...

neo21 04-06-2012 13:25 1927752

LilLoco, Ок, через 30 мин.

neo21 04-06-2012 13:33 1927761

Вложений: 2
Проэкт
XML

LilLoco 04-06-2012 13:56 1927773

а структура этого xml именно нужна такая?

Ну в общем вот какая картина:

У типа XmlNode есть свойство NextSibling, которое, как я понял, пока есть еще элементы с одним "названием" next4 возвращает следующий XmlNode.
То есть получается так:
Код:

Dim XN As XmlNode = Nothing
...........
XN = node("next4")
при добавлении первой строки берем XN.InnerText
While(пока есть еще элементы)
XN = XN.NextSibling;
Me.DataGridView1.Rows.Add("", "", "", XN.InnerText)
EndWhile

Осталось сделать проверку на существование других элементов.

P.S. C VB не знаком, могут быть ошибки...

neo21 04-06-2012 14:15 1927789

Цитата:

Цитата LilLoco
а структура этого xml именно нужна такая? »

Да

LilLoco, Спасибо большое, все работает.

LilLoco 04-06-2012 14:28 1927805

neo21, Обращайтесь ;)

neo21 04-06-2012 19:03 1927980

LilLoco, А как сделать если, XML фаил будет иметь такой вид:
Код:

<?xml version="1.0" encoding="windows-1251"?>
<document>
  <data>
    <next1>777</next1>
    <next2>888</next2>
    <next3>999</next3>
          <next4 ROWNUM="2">1</next4>
        <next4 ROWNUM="4">2</next4>
        <next4 ROWNUM="6">3</next4>
        <next4 ROWNUM="8">4</next4>
  </data>
 </document>

То есть ROWNUM="2",ROWNUM="4",ROWNUM="6",ROWNUM="8" номера строк
Если делаю так:
Код:

For Each node In nodes
                Me.DataGridView1.Rows.Add(EmptyStringToNull(node("next1").InnerText), EmptyStringToNull(node("next2").InnerText), EmptyStringToNull(node("next3").InnerText), EmptyStringToNull(node("next4").InnerText))
                Dim XN As XmlNode = Nothing
                XN = node("next4")
                For i = 0 To 100
                    XN = XN.NextSibling
                    Me.DataGridView1.Rows.Add("", "", "", XN.InnerText)
                Next i
Next

То загружает подряд:



А надо в выбранные строки ROWNUM="2",ROWNUM="4",ROWNUM="6",ROWNUM="8":


LilLoco 04-06-2012 19:32 1927999

neo21, Сейчас я вам не могу точно сказать. Но у XmlNode есть свойства различные, среди которых есть даже "полное описание узла". Можно использовать его, парсить, выбирать номер строки, и дальше не сложная логика в какую строку вносить... Те строки, которые не нужны, просто все пустыми вставляете...

Теоретически так... На практике смогу только завтра посмотреть...
Покопайтесь в свойствах, может можно и проще сделать...


Время: 05:22.

Время: 05:22.
© OSzone.net 2001-