powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Валидация xml средствами VBA
7 сообщений из 7, страница 1 из 1
Валидация xml средствами VBA
    #39430465
Фотография xax_nv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую всех!
Позаимствовал на следующий код:

Код: vbnet
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.
Sub XSD_Validation()
    Dim xmlDoc As MSXML2.DOMDocument60
    Dim objSchemaCache As New XMLSchemaCache60
    Dim objErr As MSXML2.IXMLDOMParseError

    objSchemaCache.Add "http://www.w3.org/2001/XMLSchema", LoadXmlFile("D:\Val\MP\MP_v06.xsd")

    Set xmlDoc = LoadXmlFile("D:\Val\GKUZU_22367C5E-8E04-4806-9AED-5476E148D1B2.xml")
    Set xmlDoc.Schemas = objSchemaCache

    Set objErr = xmlDoc.Validate()
    If objErr.errorCode = 0 Then
        Debug.Print "No errors found"
    Else
        Debug.Print "Error parser: " & objErr.errorCode & "; " & objErr.reason
    End If
End Sub

Function LoadXmlFile(Path As String) As MSXML2.DOMDocument60
    Set LoadXmlFile = New MSXML2.DOMDocument60

    With LoadXmlFile
        .async = False
        .validateOnParse = False
        .resolveExternals = False
        .Load Path
    End With
End Function


В результате получаю такое сообщение:



В архиве xml-схема и xml-файл.
Понимаю, что схема ссылается на под-схемы, а как их добавить не знаю.
...
Рейтинг: 0 / 0
Валидация xml средствами VBA
    #39431446
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xax_nv,
может эта ссылка сможет чем то помочь (сам не проверял)
https://social.msdn.microsoft.com/Forums/sqlserver/en-US/648c12ec-ed84-41c0-a2ff-35fdab90ba2a/validation-of-xml-with-multiple-shemas-in-vba?forum=appsforoffice
...
Рейтинг: 0 / 0
Валидация xml средствами VBA
    #39431759
Фотография xax_nv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimport, спасибо за отклик!
Пока не совсем разобрался. Понял так, что советуют для каждой схемы повторить objSchemaCache.Add ...
Попробовал, не помогло.
...
Рейтинг: 0 / 0
Валидация xml средствами VBA
    #39431873
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xax_nvguest_rusimport, спасибо за отклик!
Пока не совсем разобрался. Понял так, что советуют для каждой схемы повторить objSchemaCache.Add ...
Попробовал, не помогло.
ну, вот, чисто ради интереса :)
Код: vbnet
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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
Function ValidateFile()
   Dim xs, sAppPath
   Set xs = CreateObject("MSXML2.XMLSchemaCache.6.0")
   strUrn = "http://www.w3.org/2001/XMLSchema"
   sAppPath = CurrentProject.Path
   strXmlFile = "GKUZU_22367C5E-8E04-4806-9AED-5476E148D1B2.xml"
   
    xs.Add strUrn, sAppPath & "\MP\_AddressInp_v05.xsd"
    xs.Add strUrn, sAppPath & "\MP\_CadastralEngineer_v05.xsd"
    xs.Add strUrn, sAppPath & "\MP\_Document_v05.xsd"
    xs.Add strUrn, sAppPath & "\MP\_GeneralCadastralWorks_v02.xsd"
    xs.Add strUrn, sAppPath & "\MP\_NumbersInp_v02.xsd"
    xs.Add strUrn, sAppPath & "\MP\_Spatial_v03.xsd"
    xs.Add strUrn, sAppPath & "\MP\dAllDocuments_v02.xsd"
    xs.Add strUrn, sAppPath & "\MP\dAllowedUse_v01.xsd"
    xs.Add strUrn, sAppPath & "\MP\dApartment_v01.xsd"
    xs.Add strUrn, sAppPath & "\MP\dAppliedFiles_v01.xsd"
    xs.Add strUrn, sAppPath & "\MP\dCategories_v01.xsd"
    xs.Add strUrn, sAppPath & "\MP\dCity_v01.xsd"
    xs.Add strUrn, sAppPath & "\MP\dDistrict_v01.xsd"
    xs.Add strUrn, sAppPath & "\MP\dEncumbrances_v02.xsd"
    xs.Add strUrn, sAppPath & "\MP\dForestUse_v01.xsd"
    xs.Add strUrn, sAppPath & "\MP\dGeopointOpred_v01.xsd"
    xs.Add strUrn, sAppPath & "\MP\dInhabitedLocalities_v01.xsd"
    xs.Add strUrn, sAppPath & "\MP\dLocationLevel1_v01.xsd"
    xs.Add strUrn, sAppPath & "\MP\dLocationLevel2_v01.xsd"
    xs.Add strUrn, sAppPath & "\MP\dLocationLevel3_v01.xsd"
    xs.Add strUrn, sAppPath & "\MP\dMethod_v02.xsd"
    xs.Add strUrn, sAppPath & "\MP\dNaturalObjects_v01.xsd"
    xs.Add strUrn, sAppPath & "\MP\dOldNumber_v01.xsd"
    xs.Add strUrn, sAppPath & "\MP\dRegionsRF_v01.xsd"
    xs.Add strUrn, sAppPath & "\MP\dSovietVillage_v01.xsd"
    xs.Add strUrn, sAppPath & "\MP\dStreets_v01.xsd"
    xs.Add strUrn, sAppPath & "\MP\dUnit_v01.xsd"
    xs.Add strUrn, sAppPath & "\MP\dUrbanDistrict_v01.xsd"
    xs.Add strUrn, sAppPath & "\MP\dUtilizations_v01.xsd"
    xs.Add strUrn, sAppPath & "\MP\P_CommonSimpleType_v01.xsd"
    xs.Add strUrn, sAppPath & "\MP\P_CommonSimpleType_v02.xsd"
    xs.Add strUrn, sAppPath & "\MP\P_CommonSimpleType_v04.xsd"
    xs.Add strUrn, sAppPath & "\MP\P_CommonSimpleType_v07.xsd"
    xs.Add strUrn, sAppPath & "\MP\smev-supplementary-commons-1.0.1.xsd"
    xs.Add strUrn, sAppPath & "\MP\MP_v06.xsd"


   ' Create an XML DOMDocument object.
   Dim xd
   Set xd = CreateObject("MSXML2.DOMDocument.6.0")

   ' Assign the schema cache to the DOM document.
   ' schemas collection.
   Set xd.schemas = xs

   ' Load XML document as DOM document.
   xd.async = False
   xd.Load sAppPath & "\" & strXmlFile

   ' Return validation results in message to the user.
   If xd.parseError.errorCode <> 0 Then
        ValidateFile = "Validation failed on " & _
             strXmlFile & vbCrLf & _
             "=====================" & vbCrLf & _
             "Reason: " & xd.parseError.reason & _
             vbCrLf & "Source: " & _
             xd.parseError.srcText & _
             vbCrLf & "Line: " & _
             xd.parseError.Line & vbCrLf
             FileValid = False
    Else
        ValidateFile = "Validation succeeded for " & _
             strXmlFile & vbCrLf & _
             "======================" & _
             vbCrLf & "Contents to be bulkloaded" & vbCrLf
             FileValid = True
    End If
End Function

?ValidateFile
Validation succeeded for GKUZU_22367C5E-8E04-4806-9AED-5476E148D1B2.xml
======================
Contents to be bulkloaded
...
Рейтинг: 0 / 0
Валидация xml средствами VBA
    #39431888
Фотография xax_nv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimport, спасибо!guest_rusimport моя ошибка была в том, что первой я добавлял основную схему.
Сейчас попробовал код в работе. "Выбросил" из xml-файла целый блок:
Код: xml
1.
2.
3.
4.
5.
<Area>
	<Area>182612</Area>
	<Unit>055</Unit>
	<Inaccuracy>48</Inaccuracy>
</Area>


Результат: FileValid = True, хотя сторонний валидатор ошибку обнаруживает.
...
Рейтинг: 0 / 0
Валидация xml средствами VBA
    #39432437
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xax_nv,
у тебя нэймспэйсы документа и схемы разные.
Код: vbnet
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.
29.
30.
Sub XSD_Validation()
    Dim xmlDoc As MSXML2.DOMDocument60
    Dim objSchemaCache As New XMLSchemaCache60
    Dim objErr As MSXML2.IXMLDOMParseError2

    objSchemaCache.Add "", LoadXmlFile("D:\Val\MP\MP_v06.xsd")

    Set xmlDoc = LoadXmlFile("D:\Val\GKUZU_22367C5E-8E04-4806-9AED-5476E148D1B2.xml")
    Set xmlDoc.Schemas = objSchemaCache

    Set objErr = xmlDoc.Validate()
    If objErr.errorCode = 0 Then
        Debug.Print "No errors found"
    Else
        Debug.Print "Error parser: code", objErr.errorCode, vbNewLine, _
            "XPath", objErr.errorXPath, vbNewLine, _
            "reason ", objErr.reason
    End If
End Sub

Function LoadXmlFile(Path As String) As MSXML2.DOMDocument60
    Set LoadXmlFile = New MSXML2.DOMDocument60

    With LoadXmlFile
        .async = False
        .validateOnParse = False
        .resolveExternals = False
        .Load Path
    End With
End Function

...
Рейтинг: 0 / 0
Валидация xml средствами VBA
    #39432472
Фотография xax_nv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотища , спасибо!
Но в таком варианте тоже выдает ошибку.

Совместил Ваш вариант и вариант предложенный guest_rusimport и все заработало.

Да, а наличие или отсутствие "2" в
Код: vbnet
1.
MSXML2.IXMLDOMParseError2

не заметил.

В итоге получился такой код, может быть кому то пригодится.
Код: vbnet
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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
Sub XSD_Validation()
    Dim xmlDoc As MSXML2.DOMDocument60
    Dim objSchemaCache As New XMLSchemaCache60
    Dim objErr As MSXML2.IXMLDOMParseError
    
    
    objSchemaCache.Add "", ("D:\Val\MP\_AddressInp_v05.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\_CadastralEngineer_v05.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\_Document_v05.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\_GeneralCadastralWorks_v02.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\_NumbersInp_v02.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\_Spatial_v03.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\dAllDocuments_v02.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\dAllowedUse_v01.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\dApartment_v01.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\dAppliedFiles_v01.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\dCategories_v01.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\dCity_v01.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\dDistrict_v01.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\dEncumbrances_v02.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\dForestUse_v01.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\dGeopointOpred_v01.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\dInhabitedLocalities_v01.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\dLocationLevel1_v01.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\dLocationLevel2_v01.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\dLocationLevel3_v01.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\dMethod_v02.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\dNaturalObjects_v01.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\dOldNumber_v01.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\dRegionsRF_v01.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\dSovietVillage_v01.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\dStreets_v01.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\dUnit_v01.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\dUrbanDistrict_v01.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\dUtilizations_v01.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\P_CommonSimpleType_v01.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\P_CommonSimpleType_v02.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\P_CommonSimpleType_v04.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\P_CommonSimpleType_v07.xsd")
    objSchemaCache.Add "", ("D:\Val\MP\smev-supplementary-commons-1.0.1.xsd")
    
    objSchemaCache.Add "", ("D:\Val\MP\MP_v06.xsd")
    
    Set xmlDoc = LoadXmlFile("D:\Val\GKUZU_22367C5E-8E04-4806-9AED-5476E148D1B2.xml")
    Set xmlDoc.schemas = objSchemaCache

    Set objErr = xmlDoc.Validate()
    If objErr.errorCode = 0 Then
        Debug.Print "No errors found"
    Else
        Debug.Print objErr.reason
    End If
End Sub

Function LoadXmlFile(Path As String) As MSXML2.DOMDocument60
    Set LoadXmlFile = New MSXML2.DOMDocument60

    With LoadXmlFile
        .async = False
        .validateOnParse = False
        .resolveExternals = False
        .Load Path
    End With
End Function



guest_rusimport , скукотища , большое спасибо обоим!
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Валидация xml средствами VBA
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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