Имя: Пароль:
1C
 
А как проверить XML на соответсвие схеме сразу весь?
0 RomaH
 
naïve
28.11.14
11:31
Есть XML на 23 метра информации
Есть схема 617 кб

XML формируется достаточно долго, и ошибок там может быть сотни

а проверка ругается на первую найденную и все

как проверить сразу все?

сейчас проверяю так:

    //Проверка
    СхемаПроверки = Новый COMОбъект("msxml2.DOMDocument.6.0");
    
    СхемаПроверки.load(ИмяФайлаСхемы);
    
    schema = Новый COMОбъект("msxml2.XMLSchemaCache.6.0");

    schema.add("", СхемаПроверки);

    testing = Новый COMОбъект("msxml2.DOMDocument.6.0");
    
    testing.load(ИмяФайлаСообщения);

    testing.schemas = schema;
    error = testing.validate();

    Если error.errorCode <> 0 Тогда
        Результат = " Причина: " + error.reason;
        Результат = Результат + Символы.ПС + " XPath: " + error.errorXPath;
    КонецЕсли;
    
    УдалитьФайлы(ИмяФайлаСообщения);
    УдалитьФайлы(ИмяФайлаСхемы);
1 Господин ПЖ
 
28.11.14
11:32
>как проверить сразу все?

как валидатор написан так он и проверяет
2 RomaH
 
naïve
28.11.14
11:32
например последняя ошибка:
не соответствие длине поля СНИЛС

выдало только одно значение
а вдруг их там много? таких не соответствующих длине?
3 Господин ПЖ
 
28.11.14
11:33
с точки зрения схемы документ уже идет в мусорное ведро - нет смысла ковырять дальше
4 RomaH
 
naïve
28.11.14
11:33
(1) что есть валидатор? в моем случае?
5 Господин ПЖ
 
28.11.14
11:36
там еще validateNode есть - проверка узла
6 Maxus43
 
28.11.14
11:36
ОбъектXDTO (XDTODataObject)
Проверить (Validate)
Синтаксис:

Проверить()
Описание:

Проверяет данный объект на соответствие модели XDTO.
7 Лодырь
 
28.11.14
11:39
(2) в общем случае, при обнаружении ошибки проверять дальше нет возможности, поскольку непонятно, где начало у верного куска и на соответствие чему проверять.
8 RomaH
 
naïve
28.11.14
11:48
а что написать в схеме, чтобы проверяла все сразу?
9 RomaH
 
naïve
28.11.14
11:49
(5) там- это где?
10 RomaH
 
naïve
28.11.14
11:55
(6) оно проверить все или тоже до первой ошибки?
или там можно организовать обход коллекции (ОбъектыXDTO) полученные из XML
и проверять каждый из них на соответсвие схеме?
11 Господин ПЖ
 
28.11.14
11:56
(9) в msxml2.XMLSchemaCache.6.0 ясен купорос

может ты msdn полистаешь? масса тупых вопросов отпадет
12 Serginio1
 
28.11.14
11:56
13 Serginio1
 
28.11.14
12:01
14 Serginio1
 
28.11.14
12:04
15 RomaH
 
naïve
28.11.14
12:08
Dim xd As New MSXML2.DOMDocument60
Dim xs As New MSXML2.XMLSchemaCache60
Dim er As IXMLDOMParseError
Dim nlist As IXMLDOMNodeList
Dim node As IXMLDOMNode

  xs.Add "urn:books", App.Path & "\validateNode.xsd"
  Set xd.schemas = xs
  xd.validateOnParse = False
  xd.async = False
  xd.Load App.Path & "\validateNode.xml"

  Set er = xd.validate
  If er.errorCode <> 0 Then
    MsgBox "invalid dom: " & vbCrLf & er.reason
  Else
    MsgBox "dom is valid: " & vbCrLf & xd.xml
  End If

//вот отсюда начиная?

  Set nlist = xd.selectNodes("//book")
  i = 0
  For Each node In nlist
    Set er = xd.validateNode(node)
    If er.errorCode <> 0 Then
      MsgBox "invalid node: " & vbCrLf & er.reason
    Else
      MsgBox node.xml
    End If
  Next
16 Serginio1
 
28.11.14
12:42
17 Serginio1
 
28.11.14
12:47
18 RomaH
 
naïve
28.11.14
13:09
(16)
http://www.cyberforum.ru/csharp-beginners/thread1242952.html
я так понял, там так и не решена задача:

"2. Это понятно, но проблема не в этом. Проблема в том, что функция ValidationCallBack всегда вызывается один раз, независимо от количества ошибок в файле XML. Всегда обрабатывается первая найденная ошибка, текст ошибки выводится на экран, а все остальные ошибки игнорируются. Если исправить первую ошибку и вызвать валидацию повторно, то будет найдена следующая первая попавшаяся ошибка и т. д. пока все ошибки не будут исправлены. Но мне то не хочется вылавливать ошибки по одной, хочется сразу их все увидеть."
19 Serginio1
 
28.11.14
13:12
(18) Видно зависит от ошибки. Попробуй 17
20 RomaH
 
naïve
28.11.14
13:58
(19) очень извиняюсь
а в контексте 1С это как писать? какие объекты создавать?

    СхемаПроверки = Новый COMОбъект("msxml2.DOMDocument.6.0");
    
    Ридер = Новый COMОбъект("msxml2.SAXXMLReader.6.0");
    
    
    СхемаПроверки.load(Объект.ФайлСхемы);
    
    schema = Новый COMОбъект("msxml2.XMLSchemaCache.6.0");
    
    schema.add("", СхемаПроверки);
    
    testing = Новый COMОбъект("msxml2.DOMDocument.6.0");

тут более-менее понятно
а тут?


Imports System
Imports System.Xml
Imports System.Xml.Schema

Class XmlSchemaSetExample

    Shared Sub Main()

        Dim booksSettings As XmlReaderSettings = New XmlReaderSettings()
        booksSettings.Schemas.Add("http://www.contoso.com/books";, "books.xsd")
        booksSettings.ValidationType = ValidationType.Schema
        AddHandler booksSettings.ValidationEventHandler, New ValidationEventHandler(AddressOf booksSettingsValidationEventHandler)

        Dim books As XmlReader = XmlReader.Create("books.xml", booksSettings)

        While books.Read()

        End While

    End Sub
21 Serginio1
 
28.11.14
14:08
(20) Здесь проблема с booksSettingsValidationEventHandler



Imports System
Imports System.Xml
Imports System.Xml.Schema

Class XmlSchemaSetExample

    Shared Sub Main()

        Dim booksSettings As XmlReaderSettings = New XmlReaderSettings()
        booksSettings.Schemas.Add("http://www.contoso.com/books";, "books.xsd")
        booksSettings.ValidationType = ValidationType.Schema
        AddHandler booksSettings.ValidationEventHandler, New ValidationEventHandler(AddressOf booksSettingsValidationEventHandler)

        Dim books As XmlReader = XmlReader.Create("books.xml", booksSettings)

        While books.Read()

        End While

    End Sub

    Shared Sub booksSettingsValidationEventHandler(ByVal sender As Object, ByVal e As ValidationEventArgs)

        If e.Severity = XmlSeverityType.Warning Then
            Console.Write("WARNING: ")
            Console.WriteLine(e.Message)

        ElseIf e.Severity = XmlSeverityType.Error Then
            Console.Write("ERROR: ")
            Console.WriteLine(e.Message)
        End If

    End Sub

End Class


Посмотри v8: v8: Использование сборок .NET в 1С 7.x и 8.x

пример с событиями
22 RomaH
 
naïve
28.11.14
14:52
все оказалось проще:
на основе кода из (0) только правильные свойства установить и методы

    ДОМ.async=Ложь;
    ДОМ.validateOnParse=Истина;
    ДОМ.resolveExternals=Истина;
    Если ВыводитьВсеОшибки Тогда
        ДОМ.SetProperty("MultipleErrorMessages",Истина);
    КонецЕсли;
    ДОМ.load(ИмяФайла);
    
    Если (ДОМ.parseError.errorCode<>0) Тогда
        // ошибки при проверке правильности
        ВывестиСообщение("При проверке по схеме выявлены ошибки!",Куда,Форматировать);
        Если ВыводитьВсеОшибки Тогда
            Для каждого parseError из ДОМ.parseError.AllErrors  Цикл
                ВывестиОшибкуРазбораХМЛ(parseError,Куда,Форматировать);
            КонецЦикла;
        Иначе
            ВывестиОшибкуРазбораХМЛ(ДОМ.parseError,Куда,Форматировать);
        КонецЕсли;
    Иначе
        ВывестиСообщение("Файл успешно прошёл проверку по схеме!",Куда,Форматировать);
        РезПроверки=Истина;
    КонецЕсли;

http://infostart.ru/public/202643/
23 RomaH
 
naïve
28.11.14
14:53
ссылка на обработку:
http://infostart.ru/public/202643/