Как проверить XML с помощью XSD(из кода)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Как проверить XML с помощью XSD(из кода)

Сообщение ANDLL » 29.09.2004 (Ср) 18:56

сабж :roll:

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 30.09.2004 (Чт) 13:15

Ну хорошо. А не из кода? Хоть как-то?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

marvan
Бывалый
Бывалый
 
Сообщения: 269
Зарегистрирован: 22.06.2004 (Вт) 13:26
Откуда: Москва

Сообщение marvan » 30.09.2004 (Чт) 13:28

Ну хорошо. А не из кода? Хоть как-то?

XMLSPY 2004 это делает

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 30.09.2004 (Чт) 19:03

А если из кода? И вообще, где-то написано, что сам IE может проверять XML-файлы на валидность. Так ли це? и в каком теге задаеться элемент верхнего уровня? А то там много одноранговых xsd:element... Даже не ясно, какой из них верхний.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 01.10.2004 (Пт) 17:24

А MSXML не поможет?

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 01.10.2004 (Пт) 21:45

В том то и дело. Как это сробить с помощью MSXML?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ta_gena
Бывалый
Бывалый
 
Сообщения: 264
Зарегистрирован: 30.10.2002 (Ср) 12:18
Откуда: Russia

Сообщение ta_gena » 02.10.2004 (Сб) 8:00

ADO.NET формирует все запросы в стандарте XML. И там есть полный набор процедур для работы с XML.

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 04.10.2004 (Пн) 10:06

ANDLL писал(а):В том то и дело. Как это сробить с помощью MSXML?


Ну фиг знает.. Попробуй открыть и пробежаться по нодам первого (второго уровня)..

Код: Выделить всё
Dim xmlDoc As MSXML2.DOMDocument
Dim i As Long
Dim j As Long

Private Sub Form_Load()

Set xmlDoc = New DOMDocument
xmlDoc.async = False

xmlDoc.Load "c:\MyXML.xml"

For i = 0 To xmlDoc.documentElement.childNodes(0).childNodes.length - 1
        For j = 0 To xmlDoc.documentElement.childNodes(0).childNodes(i).childNodes.length - 1
        Next j
Next i

End Sub

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 04.10.2004 (Пн) 18:39

Пробежался. А дальше чего? Вопрос, вроде технологический, может microsoft какой парсер выпустила, или нет?

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 05.10.2004 (Вт) 9:58

ANDLL писал(а):Пробежался. А дальше чего? Вопрос, вроде технологический, может microsoft какой парсер выпустила, или нет?


Извини, может я чего-то не понял? Но как, например, проверить программный код на синтаксис? Либо визуально (зависит от сложности), либо скомпилить EXE'шник (в этом случае компилятор всё сделает за тебя). Вот и с xml я имел в виду, что нужно её полностью пропарсить. Если все ветки, значения, аттрибуты читаются - разве это не означает, что код xml верен?

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 05.10.2004 (Вт) 10:41

Если все ветки, значения, аттрибуты читаются - разве это не означает, что код xml верен?

Это долго и нудно. Проще в той-же XML-ке сохранять, к примеру, контрольную сумму этого файла. И при получении этой XML-ки в другом месте проверять ее. По крайней мере я так и делал, в свое время.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 05.10.2004 (Вт) 10:46

Это долго и нудно. Проще в той-же XML-ке сохранять, к примеру, контрольную сумму этого файла. И при получении этой XML-ки в другом месте проверять ее. По крайней мере я так и делал, в свое время.


Почему долго и нудно? Один раз код написать более-менее универсальный..

А что делать если XML генерируется каким-нибудь удалённым серваком из БД? И нет возможности дописать контрольную сумму?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 05.10.2004 (Вт) 10:49

Это нужно в XML вставить (путь к DTD у тебя свой будет, можно и локальный):
Код: Выделить всё

<?xml version="1.0" encoding="win-1251"?>
<!DOCTYPE package PUBLIC "-//MyDTD//My Protocol//EN" "http://www.acme.com/my.dtd">

....




А это как все проверить:
Код: Выделить всё
Dim doc As MSXML2.DOMDocument
Dim xerr As MSXML2.IXMLDOMParseError

Set doc = New MSXML2.DOMDocument
doc.loadXML XMLString
Set xerr = doc.Validate()
If xerr.errorCode <> 0 Then
    With xerr
         Debug.Print "Error: " & .errorCode & " on line " & .Line & " position " & .linepos
         Debug.Print .reason
         Debug.Print .srcText
    End With
End If

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 05.10.2004 (Вт) 11:06

Почему долго и нудно? Один раз код написать более-менее универсальный..


Ну попробуй. В XML-ку я могу запихнуть что угодно, включая Recordset-ы. Кроме того по пути могут быть внесены изменения не приводящие к синтаксической ошибке - никакая валидация на это вообще никогда не сработает.

А что делать если XML генерируется каким-нибудь удалённым серваком из БД? И нет возможности дописать контрольную сумму?


Тогда только валидация - тут уже сказали как (сам я не пробовал).
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 05.10.2004 (Вт) 12:09

2Scuder: Существует единый стандарт XML. Он указывает, что атрибуты беруться в кавычки, теги обязателно должны быть парными и т.п. Если документ не удовлетворяет эти правилам, он просто не парситься(целиком). И метод load(XMLload) возвращает false. А в твоем случае, если ты начинаешь пробегаться по нодам, значит документ уже загружен и отпарсен.
Кроме общего формата существуют еще и отдельные типы файлов, производные от XML. Они, кроме того, что являються XML-документами, еще и имеют определенный набор тегов. Для проверки таких XML документов было разработано аж два стандрата DTD и XSD. И если проверка с помощью DTD заложена в XML-парсере изначально, то вот проверка XSD по-умолчанию не производиться.
По этой причине код, предложенный Konst_One не пройдет.
Т.е. у меня есть локальный XML-документ и есть локальная XSD-схема. Как проверить первый на предмет соответствия второму.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 05.10.2004 (Вт) 12:38

на счет XSD ничего посоветовать не могу, юзал только DTD

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 06.10.2004 (Ср) 15:01

вот нашел в документации по XML SDK:



Код: Выделить всё
Set oSchemaCache = CreateObject("Msxml2.XMLSchemaCache.4.0")
nsTarget="http://www.example.microsoft.com/po"
oSchemaCache.add nsTarget, "po2.xsd"

Set oDoc = CreateObject("Msxml2.DOMDocument.4.0")
oDoc.async = false
oDoc.validateOnParse = true
set oDoc.schemas = oSchemaCache
oDoc.load "po2.xml"



а там дальше смотри ошибки парсера.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 06.10.2004 (Ср) 17:32

Спасибо, Konst_One. Посмотрю, вроде то...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог


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

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

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 2

    TopList