Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Валидация xml средствами VBA / 7 сообщений из 7, страница 1 из 1
30.03.2017, 20:18
    #39430465
xax_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валидация xml средствами VBA
Приветствую всех!
Позаимствовал на следующий код:

Код: 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
02.04.2017, 01:34
    #39431446
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валидация xml средствами VBA
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
03.04.2017, 06:33
    #39431759
xax_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валидация xml средствами VBA
guest_rusimport, спасибо за отклик!
Пока не совсем разобрался. Понял так, что советуют для каждой схемы повторить objSchemaCache.Add ...
Попробовал, не помогло.
...
Рейтинг: 0 / 0
03.04.2017, 10:24
    #39431873
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валидация xml средствами VBA
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
03.04.2017, 10:54
    #39431888
xax_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валидация xml средствами VBA
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
04.04.2017, 00:57
    #39432437
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валидация xml средствами VBA
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
04.04.2017, 06:58
    #39432472
xax_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валидация xml средствами VBA
скукотища , спасибо!
Но в таком варианте тоже выдает ошибку.

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


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