Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Подскажите как правильно извлекать данные из XML Добавлено: 17.03.09 12:46  

Автор вопроса:  KreAtoR
Сижу в VB6 и достаю из xml данные. делаю это пока что очень плохим способом и он не всегда работает. поэтому прошу подсказать как правильно работать с xml в vb6
вот мой примерчик

Public Function ReadXML(file As String, first As String, Optional second As String = "", Optional third As String = "", Optional fourth As String = "") As String
    Dim i As Long
    Dim arrFirst(1) As String
    Dim arrSecond(1) As String
    Dim arrThird(1) As String
    Dim arrFourth(1) As String
    Dim xmlString As String
    Dim arrString() As String
    Dim arrStringTmp() As String
    
    arrFirst(0) = "<" & first & ">"
    arrFirst(1) = "</" & first & ">"
    arrSecond(0) = "<" & second & ">"
    arrSecond(1) = "</" & second & ">"
    arrThird(0) = "<" & third & ">"
    arrThird(1) = "</" & third & ">"
    arrFourth(0) = "<" & fourth & ">"
    arrFourth(1) = "</" & fourth & ">"
    
    On Error GoTo exitRead
    
    Dim XMLParser As DOMDocument30
    Dim xNode As IXMLDOMElement
    
    Set XMLParser = New DOMDocument30
    XMLParser.Load App.Path & "\" & file & ".xml"
    For Each xNode In XMLParser.documentElement.childNodes
        If xNode.baseName = first Then
            xmlString = xNode.xml
            arrString = Split(xmlString, arrFirst(0))
            arrStringTmp = Split(arrString(1), arrFirst(1))
            'MsgBox arrStringTmp(0)
            ReadXML = arrStringTmp(0)
            If second <> "" Then
                arrString = Split(arrStringTmp(0), arrSecond(0))
                arrStringTmp = Split(arrString(1), arrSecond(1))
                'MsgBox arrStringTmp(0)
                ReadXML = arrStringTmp(0)
            Else
            End If
            If third <> "" Then
                arrString = Split(arrStringTmp(0), arrThird(0))
                arrStringTmp = Split(arrString(1), arrThird(1))
                'MsgBox arrStringTmp(0)
                ReadXML = arrStringTmp(0)
            Else
            End If
            If fourth <> "" Then
                arrString = Split(arrStringTmp(0), arrFourth(0))
                arrStringTmp = Split(arrString(1), arrFourth(1))
                'MsgBox arrStringTmp(0)
                ReadXML = arrStringTmp(0)
            Else
            End If
        Else
        End If
    Next xNode
    Exit Function
exitRead:
    ReadXML = ""
End Function

Ответить

  Ответы Всего ответов: 16  

Номер ответа: 1
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #1 Добавлено: 17.03.09 15:04
Отжыг :)
а nodeTypedValue от xNode не берешь по религиозным соображениям?

Ответить

Номер ответа: 2
Автор ответа:
 KreAtoR



Вопросов: 120
Ответов: 438
 Профиль | | #2 Добавлено: 17.03.09 15:05
@LamerOnLine дай лучше пример чем смееяться ;(

Ответить

Номер ответа: 3
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #3 Добавлено: 17.03.09 15:08
и не забывай что у xNode вполе тоже могут быть ChildNodes, так что рекурсия тебе поможет

Ответить

Номер ответа: 4
Автор ответа:
 KreAtoR



Вопросов: 120
Ответов: 438
 Профиль | | #4 Добавлено: 17.03.09 16:32
я понять не могу как мне childs найти уже все пааметры перепробовал.

Ответить

Номер ответа: 5
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #5 Добавлено: 17.03.09 18:03
дай лучше xml чем голословно что-то объяснять
Потому как общую теорию по xml мне рассказывать времени нет :)

Ответить

Номер ответа: 6
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #6 Добавлено: 17.03.09 18:09
а вообще не стесняйся юзать .selectNodes() и .nodeTypedValue
Я так понял тебе как раз надо найти определенные ноды и взять их значения.

Ответить

Номер ответа: 7
Автор ответа:
 KreAtoR



Вопросов: 120
Ответов: 438
 Профиль | | #7 Добавлено: 17.03.09 19:05
это сам файл

я читаю его обрезая стринг, но если в тегах поподаются одинаковые названия, хоть и на нижних уровнях, то читается не то что надо.

@LamerOnLine а куда их засунуть надо?

  1. <?xml version="1.0" encoding="iso-8859-1"?>
  2. <session>
  3. <general>
  4. <width>1008</width>
  5. <height>512</height>
  6. <top>23</top>
  7. <left>8</left>
  8. </general>
  9.  
  10. <template1>
  11. <properties>
  12. <enable>yes</enable>
  13. <name>temp1</name>
  14. <background>background1008.jpg</background>
  15. </properties>
  16. <input>
  17. <video1>
  18. <enable>yes</enable>
  19. <top>16</top>
  20. <left>16</left>
  21. <width>320</width>
  22. <height>240</height>
  23. </video1>
  24. <video2>
  25. <enable>yes</enable>
  26. <top>16</top>
  27. <left>352</left>
  28. <width>640</width>
  29. <height>480</height>
  30. </video2>
  31. <presentation>
  32. <enable>yes</enable>
  33. <autoload>no</autoload>
  34. <device>pres.ppt</device>
  35. </presentation>
  36. <html>
  37. <enable>yes</enable>
  38. <autoload>yes</autoload>
  39. <url>1.html</url>
  40. <top>273</top>
  41. <left>16</left>
  42. <width>320</width>
  43. <height>150</height>
  44. </html>
  45. </input>
  46. </template1>
  47. <template2>
  48. <properties>
  49. <enable>yes</enable>
  50. <name>temp2</name>
  51. <background>background752.jpg</background>
  52. </properties>
  53. <input>
  54. <video1>
  55. <enable>yes</enable>
  56. <top>50</top>
  57. <left>50</left>
  58. <width>400</width>
  59. <height>300</height>
  60. </video1>
  61. <video2>
  62. <enable>no</enable>
  63. <top>70</top>
  64. <left>10</left>
  65. <width>200</width>
  66. <height>200</height>
  67. </video2>
  68. <presentation>
  69. <enable>no</enable>
  70. <autoload>yes</autoload>
  71. <device>pres.ppt</device>
  72. </presentation>
  73. <html>
  74. <enable>no</enable>
  75. <autoload>yes</autoload>
  76. <url>2.html</url>
  77. <top>0</top>
  78. <left>200</left>
  79. <width>100</width>
  80. <height>100</height>
  81. </html>
  82. </input>
  83. </template2>
  84.  
  85. <output>
  86. <wme>
  87. <profile>444</profile>
  88. <file>
  89. <enable>1</enable>
  90. <name>2</name>
  91. </file>
  92. <pull>
  93. <enable>3</enable>
  94. <port>4</port>
  95. </pull>
  96. <push>
  97. <enable>5</enable>
  98. <servername>6</servername>
  99. <pubpoint>7</pubpoint>
  100. <template>8</template>
  101. <autoremove>9</autoremove>
  102. </push>
  103. <desc>
  104. <enable>12</enable>
  105. <author>13</author>
  106. <copyright>14</copyright>
  107. <rating>15</rating>
  108. <description>16</description>
  109. <title>17</title>
  110. </desc>
  111. </wme>
  112. </output>
  113. </session>

Ответить

Номер ответа: 8
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #8 Добавлено: 18.03.09 10:56
Ничего обрезать не надо, все делает xml парсер.
Поясни что конкретно тебе надо из этого файла вытащить.

Ответить

Номер ответа: 9
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #9 Добавлено: 18.03.09 11:13
У тебя, похоже, в xml хранятся какие-то единичные настройки (в том смысле что ноды у тебя не повторяющиеся). Ну, для примера

Private Sub Form_Load()
Dim xmlDOC As New DOMDocument40
Dim xmlNode As IXMLDOMElement
xmlDOC.Load "d:\myxml.xml"
MsgBox "Parameter 'ServerName from your xml is " & _
xmlDOC.selectSingleNode("session/output/wme/push/servername";).nodeTypedValue
End Sub

Ответить

Номер ответа: 10
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #10 Добавлено: 18.03.09 11:15
Вместо смайла - скобка. Додумались вставить поддержку смайлов внутри тега CODE....

Ответить

Номер ответа: 11
Автор ответа:
 KreAtoR



Вопросов: 120
Ответов: 438
 Профиль | | #11 Добавлено: 18.03.09 11:40
Все сделал. выкладываю пример если кому понадобится.

XML Файл:
  1. <?xml version="1.0" encoding="windows-1252"?>
  2. <Adressen>
  3.     <Kontakt ID="1">
  4.         <Vorname>Max</Vorname>
  5.         <Name>Mustermann</Name>
  6.         <Strasse>Musterweg 4</Strasse>
  7.         <Ort>Musterhausen</Ort>
  8.         <PLZ>12345</PLZ>
  9.         <Telefon>0123456789</Telefon>
  10.     </Kontakt>
  11.     <Kontakt ID="2">
  12.         <Vorname>Maxima</Vorname>
  13.         <Name>Musterfrau</Name>
  14.         <Strasse>Musterstrasse 2</Strasse>
  15.         <Ort>Musterdorf</Ort>
  16.         <PLZ>45836</PLZ>
  17.         <Telefon>032453529</Telefon>
  18.     </Kontakt>
  19. </Adressen>


В проекте прикрепляем Microsoft XML 3.0


а это вставте куда нить на форму или в класс да вызовите.
  1. Dim objXML As MSXML2.DOMDocument40
  2.     
  3. Public Sub ReadXMLFile()
  4.     Set objXML = New MSXML2.DOMDocument40
  5.     
  6.     ' Struktur des Dokumentes beim Laden pr&#252;fen
  7.     objXML.validateOnParse = True
  8.     
  9.     objXML.Load ("App.Path & "\kontakte.xml") <br>
  10.     MsgBox objXML.documentElement.selectSingleNode("/Adressen/Kontakt").Text
  11.     MsgBox objXML.documentElement.selectSingleNode("/Adressen/Kontakt/PLZ").Text
  12.     
  13.     Set objXML = Nothing
  14. End Sub

Ответить

Номер ответа: 12
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #12 Добавлено: 18.03.09 11:56
Мне кажется это ты спрашивал. Зачем этот пример другим? :)
Тем более что
1. В рефах ставишь xml3, а используешь dom4
2. У тебя в Adressen двое нодов-детишек Kontakt, ты же берешь нод через SingleNode
В общем, есть над чем поработать. Да и с выкладыванием примеров я бы не торопился ;)

Ответить

Номер ответа: 13
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #13 Добавлено: 18.03.09 12:02
Хотя забей. Работает - и ладно. Есть повод обмыть :)
Сорри за оффтоп, именно этим и занимаюсь...

Ответить

Номер ответа: 14
Автор ответа:
 KreAtoR



Вопросов: 120
Ответов: 438
 Профиль | | #14 Добавлено: 18.03.09 12:44
Все работает как надо. могу даже передать ID и так далее, очень удобно и легко.
вот ссылка на тему: http://www.activevb.de/tutorials/tut_msxml/msxml.html

Ответить

Номер ответа: 15
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #15
Добавлено: 26.03.09 01:21
LamerOnLine пишет:
Додумались вставить поддержку смайлов внутри тега CODE....

Это устаревший тег. Используй [sоurce][/sоurce]

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам