Как определить отсутствие ветки XML?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Как определить отсутствие ветки XML?

Сообщение Rojohn » 07.11.2005 (Пн) 15:42

Привет всем!
Есть такая задачка - считать файл XML, причем некоторые тэги могут отсутствовать. Вопрос: Как проверить наличие тэга в файле XML? Что-то наверное должно быть NULL, только что? Например есть ветка
Dim nds7 As IXMLDOMNodeList
пробовал писать что-то вроде
If IsNull(nds7.item(0).NodeValue)=True then
но это не то.

Как правильно?
Заранее спасибо за помощь!

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 07.11.2005 (Пн) 16:05

Код: Выделить всё
Dim XMLDoc As MSXML2.DOMDocument
Dim Node As MSXML2.IXMLDOMElement

Set XMLDoc = New MSXML2.DOMDocument
...
Set Node = XMLDoc.selectSingleNode("node_path")
If (Node Is Nothing) Then
    ...
End If

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

?

Сообщение Rojohn » 07.11.2005 (Пн) 16:41

Dim XMLDoc As MSXML2.DOMDocument


Какая библиотека используется? У меня работает только:
Код: Выделить всё
Dim XMLDoc As IXMLDOMDocument

или
Код: Выделить всё
Dim XMLDoc As MSXML.DOMDocument

использую библиотеку MSXML.dll (version 2.0) из VB60 SP3
И что такое "node_path" - полный путь к ветке или сам Node?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 07.11.2005 (Пн) 17:10

Какая библиотека используется?

version 4.0
И что такое "node_path" - полный путь к ветке или сам Node?

Название ветки.
Лучший способ понять что-то самому — объяснить это другому.

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Re: ?

Сообщение skiperski » 07.11.2005 (Пн) 17:25

Rojohn писал(а):Какая библиотека используется?

Без разницы, будет работать в любой версии.

Rojohn писал(а):И что такое "node_path" - полный путь к ветке или сам Node?

Если XML-документ имеет структуру
Код: Выделить всё
<catalog>
    <book isbn="12345">
        <caption>Mein Kampf</caption>
        <author>A. Hitler</author>
    </book>
    <book isbn="67890">
        <caption>Kapital</caption>
        <author>K. Marks</author>
    </book>
</catalog>
, то к автору первой книги можно обратиться
Код: Выделить всё
Set Node = XMLDoc.selectSingleNode("catalog/book[position()=1]/author")

или
Код: Выделить всё
Set Node = XMLDoc.selectSingleNode("catalog/book[@isbn='12345']/author")

, или
Код: Выделить всё
Set Node = XMLDoc.firstChild.selectSingleNode("book[@isbn='12345']/author")

, или
Код: Выделить всё
Set RootNode = XMLDoc.selectSingleNode("catalog")
Set BookNodes = RootNode.selectNodes("book")
Set RootNode = BookNodes(1).selectSingleNode("author")

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Сообщение Rojohn » 07.11.2005 (Пн) 22:04

Прошу прощения, но, хотя всё здесь написанное очень интересно для общего развития, но у меня вся загрузка-выгрузка уже написаны с использованием IXMLDOMNodeList. Может можно как-то определить отсутствие ветки используя такое объявление Nod-а?
З.ы.: с моим объявлением предложенный код:
Dim XMLDoc As MSXML2.DOMDocument
Dim Node As MSXML2.IXMLDOMElement

Set XMLDoc = New MSXML2.DOMDocument
...
Set Node = XMLDoc.selectSingleNode("node_path")
If (Node Is Nothing) Then
...
End If

увы... не работает :oops:

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 07.11.2005 (Пн) 22:15

IXMLDOMNodeList - это не нод, а коллекция нодов, например, в примере выше это BookNodes. Можно, конечно, и коллекцию выбирать. Тогда нужно проверять её свойство length.

ЗЫ: А что, трудно переобъявить?

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Сообщение Rojohn » 07.11.2005 (Пн) 22:22

К сожалению слишком много наворочено уже... там многих свойств не хватает. Так что придётся всё изучать заново. Например у него нет свойства .item() и я думаю это не единственное отличие.

З.ы.: кстати, всё вроде работает и без проверки длины.

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 07.11.2005 (Пн) 22:24

А зачем элементу или в общем случае ноду item(), если он уже и есть тот самый айтем?

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Сообщение Rojohn » 07.11.2005 (Пн) 22:32

Да я всё понимаю, только их придётся везде удалять и т.п. К тому же мы делаем проект вдвоём с одним челом, который отказывается от такой глобальной переделки, т.к. этот кусок начинал делать он 8)
Может можно как-нить определить отсутствие такого Node (коллекционного)? По сути отсутствие дочерней коллекции... так?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 08.11.2005 (Вт) 11:28

К тому же мы делаем проект вдвоём с одним челом, который отказывается от такой глобальной переделки, т.к. этот кусок начинал делать он


Срочно перечитать пассаж "Если бы программисты строили дома" :lol:
Лучший способ понять что-то самому — объяснить это другому.


Вернуться в Visual Basic 1–6

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

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

    TopList