Войти

Показать полную графическую версию : Импорт XML файла в Visual Basic 2010


neo21
03-06-2012, 23:24
Доброго времени суток.
Есть 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>
С помощью программы:

Код:
http://i.piccy.info/i7/7b616540e13d0826a5afa13b4eed30f6/1-5-8596/40128949/vopros.jpg

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
в столбец next4 грузились все данные: »
Т.е. в одну ячейку все 4 данных? или как? Покажи на примере Excel, каким ты хочешь видеть результат.

neo21
04-06-2012, 10:26
Покажи на примере Excel, каким ты хочешь видеть результат. »

http://i.piccy.info/i7/3298e249dd07848c1dff457b5b218ce8/1-5-8604/43037276/vopros2.jpg

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

neo21
04-06-2012, 12:26
а на последующих итерациях добавлять только лишь строки с данными из next4 »
Не пойму как добавить строки с данными из next4
Куда ставить:
ROWNUM="2"
ROWNUM="3"
ROWNUM="4"

LilLoco
04-06-2012, 12:55
Если не сложно и не секретно можно выложить проект и *.xml файл? Будет проще разобраться =)

neo21
04-06-2012, 13:22
LilLoco, Так он есть Код:
<?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
Еще бы сам проект =) Чтобы не писать код самостоятельно...

neo21
04-06-2012, 13:25
LilLoco, Ок, через 30 мин.

neo21
04-06-2012, 13:33
Проэкт (http://forum.oszone.net/attachment.php?attachmentid=83243&stc=1&d=1338802353)
XML (http://forum.oszone.net/attachment.php?attachmentid=83244&stc=1&d=1338802353)

LilLoco
04-06-2012, 13:56
а структура этого 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
а структура этого xml именно нужна такая? »
Да

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

LilLoco
04-06-2012, 14:28
neo21, Обращайтесь ;)

neo21
04-06-2012, 19:03
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
То загружает подряд:

http://i.piccy.info/i7/3298e249dd07848c1dff457b5b218ce8/1-5-8604/43037276/vopros2.jpg

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

http://i.piccy.info/i7/f5944e63ff701b90eea803385a9f2a17/1-5-8623/1764331/vopros3.jpg

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

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




© OSzone.net 2001-2012