![]() |
![]() |
![]() |
|
А как проверить 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/ |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |