Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как считать узлы в xsd / 16 сообщений из 16, страница 1 из 1
06.10.2008, 10:55
    #35577447
Kallandor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как считать узлы в xsd
Доброго времени суток, ув. програмисты Visual Basic

Подскажите пожалуйста как в xsd файле выбрать значения? Вот, например, имеется xsd-файл:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:mstns="http://tempuri.org/XMLSchema.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="Table">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="FieldId" type="xs:int" />
				<xs:element name="FieldName" type="xs:string" />
				<xs:element name="FieldType" type="xs:string" />
				<xs:element name="FieldSize" type="xs:int" />
				<xs:element name="FieldKey" type="xs:int" />
				<xs:element name="FieldCode" type="xs:int" />
				<xs:element name="EnumType" type="xs:string" />
			</xs:sequence>
		</xs:complexType>
		<xs:key name="TableKey1">
			<xs:selector xpath="." />
			<xs:field xpath="mstns:FieldId" />
		</xs:key>
	</xs:element>
</xs:schema>

Собственно в VB я его открываю:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Dim oXMLDom As New DOMDocument30
Dim oNode As IXMLDOMNode
Dim nodeList As MSXML2.IXMLDOMNodeList
Dim i%

oXMLDom.async = False
oXMLDom.validateOnParse = False
oXMLDom.resolveExternals = False
oXMLDom.preserveWhiteSpace = True

If oXMLDom.Load(App.Path + "\xml\TableShema.xsd") = False Then
    MsgBox "Failed to load xml data from file."
    Exit Sub
End If

Set nodeList = oXMLDom.selectNodes("//xs")

Debug.Print "xs:"; nodeList.length
        For Each node In nodeList
            For Each attr In node.Attributes
                Debug.Print attr.nodeName; "="; attr.Text,
            Next
            Debug.Print
        Next

Ну и мне в отладчике ничего не печается, а надо чтобы напечатались значения FieldId, FieldName и т.д.

Как их вывести? подскажите пожалуйста
...
Рейтинг: 0 / 0
06.10.2008, 16:43
    #35578599
Kallandor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как считать узлы в xsd
Возник еще один вопрос, возможно глупый. А можно ли создать пользовательский тип данных в рантайме?
...
Рейтинг: 0 / 0
06.10.2008, 17:14
    #35578683
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как считать узлы в xsd
> Автор: Kallandor
> Возник еще один вопрос, возможно глупый. А можно ли создать пользовательский тип
> данных в рантайме?


Зачем тебе в рантайме определять тип?
Или я не понял вопрос?

З.Ы. Вечером отвечу

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
06.10.2008, 17:16
    #35578691
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как считать узлы в xsd
> > Автор: Kallandor
> > Возник еще один вопрос, возможно глупый.


И кстати! Для этого вопроса, лучше было создать новую ветку.

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
06.10.2008, 17:35
    #35578754
Kallandor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как считать узлы в xsd
Игорь Горбонос
> Автор: Kallandor
> Возник еще один вопрос, возможно глупый. А можно ли создать пользовательский тип
> данных в рантайме?


Зачем тебе в рантайме определять тип?
Или я не понял вопрос?

З.Ы. Вечером отвечу

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4

Я уже разрабатываю вариант когда нельзя. Ну то есть просто создаю неопределенный массив, а потом делаю его Redim:
Код: plaintext
ReDim TmpArr( 0  To Count_Row +  1 ,  0  To Count_Field)
...
Рейтинг: 0 / 0
06.10.2008, 17:41
    #35578781
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как считать узлы в xsd
> Автор: Kallandor
>
> Я уже разрабатываю вариант когда нельзя. Ну то есть просто создаю неопределенный
> массив, а потом делаю его Redim:
>
> ReDim TmpArr(0 To Count_Row + 1, 0 To Count_Field)


Насколько я помню, ReDim действовал только на последную размерность массива.

Сделай структуру классов, которые будут имитировать строки, столбцы и хранилище строк и
столбцов. Нужен доступ по индексам строки/столбца, сделай соответсвующие свойства.

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
06.10.2008, 17:46
    #35578804
Kallandor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как считать узлы в xsd
Игорь Горбонос
> Автор: Kallandor
>
> Я уже разрабатываю вариант когда нельзя. Ну то есть просто создаю неопределенный
> массив, а потом делаю его Redim:
>
> ReDim TmpArr(0 To Count_Row + 1, 0 To Count_Field)


Насколько я помню, ReDim действовал только на последную размерность массива.

Сделай структуру классов, которые будут имитировать строки, столбцы и хранилище строк и
столбцов. Нужен доступ по индексам строки/столбца, сделай соответсвующие свойства.

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4

Не знаю, я как-то написала Redim, он сделал то что мне надо и я довольна :)
...
Рейтинг: 0 / 0
06.10.2008, 17:49
    #35578815
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как считать узлы в xsd
> Автор: Игорь Горбонос
> Насколько я помню, ReDim действовал только на последную размерность массива.


Странно, работает. Но я, почему-то уверен, что раньше не работало.

З.Ы. Что-то последнее время стал замечать что работать стало немного по-другому, чем
раньше. И это через пару лет, после прекращения развития языка. "Это жж--ж-жж-ж не
спроста" (с) Винни-Пух

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
06.10.2008, 17:52
    #35578828
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как считать узлы в xsd
> Автор: Kallandor
> Игорь Горбонос
> > Автор: Kallandor
> > ReDim TmpArr(0 To Count_Row + 1, 0 To Count_Field)
>
>
> Насколько я помню, ReDim действовал только на последную размерность массива.
> Не знаю, я как-то написала Redim, он сделал то что мне надо и я довольна :)

а ты попробуй :)
Код: plaintext
1.
2.
3.
4.
5.
Sub asd()
Dim a() As Long
ReDim a( 0  To  2 ,  0  To  3 ) As Long
ReDim a( 0  To  3 ,  0  To  3 ) As Long
ReDim Preserve a( 0  To  4 ,  0  To  3 ) As Long
End Sub


Все-же не маразм и то дело!

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
07.10.2008, 19:42
    #35581576
Kallandor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как считать узлы в xsd
Собственно по этой же теме возник еще один вопрос:

я создала файл xsd. Потом согласно схеме данных, указанных в этом файле создала файл xml. То есть в сформированном файле xml имеется строка:
Код: plaintext
1.
2.
<root xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://tempuri.org/XMLSchema.xsd
D:\Projects\MyProject\xml\TableShema2.xsd">

Вопрос: когда я загружаю указанный xml файл то как проверить его на соответствие указанной схеме?
...
Рейтинг: 0 / 0
08.10.2008, 11:31
    #35582502
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как считать узлы в xsd
> Автор: Kallandor
> Собственно по этой же теме возник еще один вопрос:
>
> я создала файл xsd. Потом согласно схеме данных, указанных в этом файле создала
> файл xml. То есть в сформированном файле xml имеется строка:
> <root xmlns="http://tempuri.org/XMLSchema.xsd"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:schemaLocation="http://tempuri.org/XMLSchema.xsd
> D:\Projects\MyProject\xml\TableShema2.xsd">
> Вопрос: когда я загружаю указанный xml файл то как проверить его на соответствие
> указанной схеме?


Загружаешь куда?
В MSXML3 было свойство которое отвечало за ошибки загруженного документа.

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
08.10.2008, 22:34
    #35584334
Kallandor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как считать узлы в xsd
Игорь Горбонос
Загружаешь куда?
В MSXML3 было свойство которое отвечало за ошибки загруженного документа.


Я сама сформировала xsd-файл, потом согласно этой схеме сформировала xml-файл. Утилита, которой я формировала позволяет валидировать. Собственно. Файл правильно отвалидирован.

Потом когда делаю
Код: plaintext
1.
2.
Dim oXMLDom As New DOMDocument30
f oXMLDom.Load(xmlName)

vb не ругается. Но хотелось бы предусмотреть ситуацию когда кто-нибудь взял да и подправил что-нибудь в xml или xsd ну и написать более менее внятную ошибку.

Да и еще вопрос. Можно ли в загружаемом файле xml динамически поменять место расположения xsd-схемы? И если можно, то как?

P.S. Когда мне что-то не понятно, то я начинаю подробно излагать до какого места не понимаю процесс. Т.е. если ты подумаешь, что я тебе как непонятливому поясняю, то это не так. Это скорее для себя и от своей же глупости. Так что не вздумай обижаться на подобные штрихи. :)
...
Рейтинг: 0 / 0
09.10.2008, 10:34
    #35584852
SoftParanoik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как считать узлы в xsd
Подключать схемы и валидировать XML можно при мерно так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Dim wSchema As New MSXML2.XMLSchemaCache60
With wSchema
  .validateOnLoad = False
  .Add "http://www.MyCompany.ru/Schema1", "c:\Schema1.xsd"
  .Add "http://www.MyCompany.ru/Schema2", "c:\Schema2.xsd"
  .Validate
End With

Dim wXML As New MSXML2.DOMDocument60
Dim wXMLErr As MSXML2.IXMLDOMParseError

With wXML
  .validateOnParse = False
  Set .schemas = wSchema
  .Load "c:\MyFile.xml"
  Set wXMLErr = .Validate
End With

Debug.Print  wXMLErr.errorCode,wXMLErr.srcText

...
Рейтинг: 0 / 0
10.10.2008, 12:20
    #35587666
Kallandor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как считать узлы в xsd
SoftParanoik

А вы не знаете, почему после того, как файл отвалидируется в соответствии со схемой то больше запросы к нему не проходят? Т.е.:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Dim oXMLDom As New DOMDocument60
Dim oNode As IXMLDOMNode
Dim attr As IXMLDOMAttribute
Dim nodeList As MSXML2.IXMLDOMNodeList
Dim tempstr$

Set nodeList = oXMLDom.documentElement.selectNodes("/root/Table")
tempstr$ = ""
Count_Field = nodeList.length
For Each oNode In nodeList
    For Each attr In oNode.Attributes
        tempstr$ = tempstr$ + CStr(attr.Text)
    Next
    tempstr$ = tempstr$ + "@@@"
Next

tempstr$ - пустая строка. Если без схемы, то tempstr$ - заполняется так как надо. Почему?
...
Рейтинг: 0 / 0
10.10.2008, 13:56
    #35588014
SoftParanoik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как считать узлы в xsd
Ну а где в вашей схеме есть описание каких либо атрибутов (кстати и элемент root там тоже не описан) ?!
...
Рейтинг: 0 / 0
13.10.2008, 13:36
    #35591168
Kallandor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как считать узлы в xsd
SoftParanoikНу а где в вашей схеме есть описание каких либо атрибутов (кстати и элемент root там тоже не описан) ?!

Элемент root - описан. Атрибуты - тоже. И валидируется то ведь нормально. Только вот после валидации не работает (((

xsd
Код: plaintext
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.
28.
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:mstns="http://tempuri.org/XMLSchema.xsd" 
xmlns="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified">
    <xs:element name="root">
        <xs:complexType>
          <xs:sequence maxOccurs="unbounded">
            <xs:element name="Table">
              <xs:complexType>
                <xs:sequence maxOccurs="unbounded">
                  <xs:element name="Field">
                    <xs:complexType>
                      <xs:attribute name="FieldId" type="xs:int" use="required"/>
                      <xs:attribute name="FieldName" type="xs:string" use="required"/>
                      <xs:attribute name="FieldType" type="xs:string" use="required"/>
                      <xs:attribute name="FieldSize" type="xs:int" use="required"/>
                      <xs:attribute name="FieldKey" type="xs:int" use="required"/>
                      <xs:attribute name="PaperCode" type="xs:int" use="required"/>
                      <xs:attribute name="EnumType" type="xs:string" use="required"/>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              <xs:attribute name="TableName" type="xs:string" use="required"/>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:complexType>
   </xs:element>
</xs:schema>
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как считать узлы в xsd / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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