powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / AppendChild() в DOMDocument
10 сообщений из 10, страница 1 из 1
AppendChild() в DOMDocument
    #40100456
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
У меня есть вот такой тестовый xml-файл:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
<?xml version="1.0"?>
<bookstore> 
   <book category="cooking"> 
       <title lang="en">Everyday Italian</title> 
       <author>Giada De Laurentiis</author> 
       <year>2005</year> 
       <price>30.00</price> </book> 
   <book category="children"> 
       <title lang="en">Harry Potter</title> 
       <author>J K. Rowling</author> 
       <year>2005</year> 
       <price>29.99</price> </book> 
   <book category="web"> 
       <title lang="en">XQuery Kick Start</title> 
       <author>James McGovern</author> 
       <author>Per Bothner</author> 
       <author>Kurt Cagle</author> 
       <author>James Linn</author> 
       <author>Vaidyanathan Nagarajan</author> 
       <year>2003</year> 
       <price>49.99</price> </book> 
   <book category="web" cover="paperback"> 
       <title lang="en">Learning XML</title> 
       <author>Erik T. Ray</author> 
       <year>2003</year> 
       <price>39.95</price> </book> 
</bookstore>



При загрузке формы я загружаю в элементы ComboBox информацию из узлов <title>, а при выборе потом названия книги из Combobox уже в других полях отображается информация об авторе, год и цена:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
'Процедура загрузки xml-файла
Sub LoadXMLFile(XMLDoc As Object, root As Object)
  Dim elem As Object
  Set XMLDoc = CreateObject("MSXML2.DOMDocument")
  XMLDoc.validateOnParse = False
  XMLDoc.Load "G:\Book2.xml"
  Set root = XMLDoc.documentElement
End Sub

'заполнение combobox
Private Sub UserForm_Initialize()
  Dim i As Integer
  Dim Element As Object
  
  LoadXMLFile XMLDoc, root
  Set Element = root.getElementsByTagName("title")
  For i = 0 To Element.Length - 1
    cmbxTitle.AddItem Element(i).Text
  Next i
  Set BookElement = root.getElementsByTagName("book")
  cmbxTitle.ListIndex = 0
End Sub


Теперь я хочу добавить новую книгу , её автора , год и цену в xml-файл:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
'Кнопка добавления информации
Private Sub btnAdd_Click()
  Dim XDoc As Object
  Dim NodeElement As Object
  Dim TextNode As Object
  Dim Node As Object
  Dim root As Object


  Set XDoc = CreateObject("MSXML2.DOMDocument")
  Set NodeElement = XDoc.createElement("title")
  Set TextNode = XDoc.createTextNode(edTitle.Text)
  NodeElement.appendChild TextNode
  Set root = XDoc.documentElement
  root.appendChild NodeElement
  XDoc.Save "G:\Book2.xml"
  
End Sub


я привел только фрагмент кода. Вопрос такой: Если я создаю новый объект типа MSXML2.DOMDocument, в коде переменная XDoc, то все добавляется. Если же я пишу так:
Код: vbnet
1.
2.
3.
4.
  
  Set NodeElement = XMLDoc.createElement("title")
....
  


т.е использую уже раннее созданный объект в процедуре LoadXMLFile то вылетает ошибка Object variable not set (Runtime error 91) ?Хотя переменная объявлена как Public, данные в форму загружаются, я их просматривал
...
Рейтинг: 0 / 0
AppendChild() в DOMDocument
    #40100486
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
AppendChild() в DOMDocument
    #40100489
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
https://www.sql.ru/faq/faq_topic.aspx?fid=2539

Да нет, включил эту опцию сейчас. Даже стёр имя переменной, скопировал её с объявления переменных , все равно выдаёт
Object variable or With block not set
...
Рейтинг: 0 / 0
AppendChild() в DOMDocument
    #40100490
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Damir_85
Да нет, включил эту опцию сейчас.

везде, во всех модулях?

дай локальной переменной другое имя, чтобы точно было понятно
...
Рейтинг: 0 / 0
AppendChild() в DOMDocument
    #40100491
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так-то должно работать
...
Рейтинг: 0 / 0
AppendChild() в DOMDocument
    #40100493
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

окей, попробую, правда уже чуть попозже.
Если что отпишусь, пару вопросов еще есть)
...
Рейтинг: 0 / 0
AppendChild() в DOMDocument
    #40100495
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Damir_85
Код: vbnet
1.
2.
3.
Sub LoadXMLFile(XMLDoc As Object, root As Object)
  Dim elem As Object
  Set XMLDoc = CreateObject("MSXML2.DOMDocument")

А вообще - это говнокод.
Либо полностью работаешь с глобальной переменной.
Либо получаешь объект как результат функции.
Не надо инициализировать переменную входного параметра.
...
Рейтинг: 0 / 0
AppendChild() в DOMDocument
    #40100528
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Damir_85
Код: vbnet
1.
2.
3.
Sub LoadXMLFile(XMLDoc As Object, root As Object)
  Dim elem As Object
  Set XMLDoc = CreateObject("MSXML2.DOMDocument")

А вообще - это говнокод.
Либо полностью работаешь с глобальной переменной.
Либо получаешь объект как результат функции.
Не надо инициализировать переменную входного параметра.

Да , да я по другому уже сделал. Просто в первый раз работаю с xml
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Option Explicit

Public XDoc As Object
Public Root As Object

Sub LoadXMLFile()
  Set XDoc = CreateObject("MSXML2.DOMDocument")
  XDoc.Load "D:\Book.xml"
  Set Root = XDoc.DocumentElement
End Sub
 


Причина была в этом :
Код: vbnet
1.
2.
3.
  Private Sub UserForm_Deactivate()
  Set XMLDoc = Nothing
End Sub


Я для добавления вызываю другую форму из основной, а в основной срабатывает при этом Deactivate. и XMLDOc уже пустой.
Я еще вот что хотел спросить. А при добавлении можно чтобы каждый узел на отдельной строке располагался как в примере?
Как бы это вторичный вопрос конечно, т.к. все равно через прогу все читается, пользователь не будет читать вручную файл, просто
для удобства отладки
...
Рейтинг: 0 / 0
AppendChild() в DOMDocument
    #40100566
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Damir_85
при добавлении можно чтобы каждый узел на отдельной строке располагался
при добавлении - нет, добавляется не текст, а некий объект в некоторую внутреннюю структуру.

надо смотреть опции у XDoc.Save
...
Рейтинг: 0 / 0
AppendChild() в DOMDocument
    #40100578
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну да, понятно, Спасибо.
в крайнем случае вручную можно подправить
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / AppendChild() в DOMDocument
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (9): Анонимы (6), Bing Bot, RePredeclared, Yandex Bot 1 мин.
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]