Добрый день. Решил попробовать прочитать большой XML c использованием API SAX. Пока не могу разобраться как перехватывать события SAX. Может у кого-нибудь есть пример? Или можно на моем файле потестить (файл прикрепил). Данные из XML можно положить в массив или на лист Excel в качестве примера. Начальный код: [vba]
Код
Sub ЧтениеXML() Dim SAXReader As New SAXXMLReader60 Dim файлXML
файлXML = ThisWorkbook.Path & "\ТестовыйФайлXML.xml" SAXReader.parseURL файлXML End Sub
[/vba]
Добрый день. Решил попробовать прочитать большой XML c использованием API SAX. Пока не могу разобраться как перехватывать события SAX. Может у кого-нибудь есть пример? Или можно на моем файле потестить (файл прикрепил). Данные из XML можно положить в массив или на лист Excel в качестве примера. Начальный код: [vba]
Код
Sub ЧтениеXML() Dim SAXReader As New SAXXMLReader60 Dim файлXML
файлXML = ThisWorkbook.Path & "\ТестовыйФайлXML.xml" SAXReader.parseURL файлXML End Sub
Обычно ещё добавляют модуль класса CSAXErrorHandler для обработки ошибок с таким содержанием
[vba]
Код
Implements IVBSAXErrorHandler
Private Sub IVBSAXErrorHandler_error(ByVal oLocator As MSXML2.IVBSAXLocator, strErrorMessage As String, ByVal nErrorCode As Long) ' PrintError oLocator, strErrorMessage, nErrorCode End Sub
Private Sub IVBSAXErrorHandler_fatalError(ByVal oLocator As MSXML2.IVBSAXLocator, strErrorMessage As String, ByVal nErrorCode As Long) ' PrintError oLocator, strErrorMessage, nErrorCode End Sub
Private Sub IVBSAXErrorHandler_ignorableWarning(ByVal oLocator As MSXML2.IVBSAXLocator, strErrorMessage As String, ByVal nErrorCode As Long) ' PrintError oLocator, strErrorMessage, nErrorCode End Sub
Private Sub PrintError(oLoc As MSXML2.IVBSAXLocator, sMsg, lCode) 'MsgBox "** Oops! " & "SAX raised an error: " & lCode & ", " _ '& sMsg & " at line " & oLoc.lineNumber & ", column " & oLoc.columnNumber Application.Cursor = xlNormal End Sub
[/vba]
Обычно ещё добавляют модуль класса CSAXErrorHandler для обработки ошибок с таким содержанием
[vba]
Код
Implements IVBSAXErrorHandler
Private Sub IVBSAXErrorHandler_error(ByVal oLocator As MSXML2.IVBSAXLocator, strErrorMessage As String, ByVal nErrorCode As Long) ' PrintError oLocator, strErrorMessage, nErrorCode End Sub
Private Sub IVBSAXErrorHandler_fatalError(ByVal oLocator As MSXML2.IVBSAXLocator, strErrorMessage As String, ByVal nErrorCode As Long) ' PrintError oLocator, strErrorMessage, nErrorCode End Sub
Private Sub IVBSAXErrorHandler_ignorableWarning(ByVal oLocator As MSXML2.IVBSAXLocator, strErrorMessage As String, ByVal nErrorCode As Long) ' PrintError oLocator, strErrorMessage, nErrorCode End Sub
Private Sub PrintError(oLoc As MSXML2.IVBSAXLocator, sMsg, lCode) 'MsgBox "** Oops! " & "SAX raised an error: " & lCode & ", " _ '& sMsg & " at line " & oLoc.lineNumber & ", column " & oLoc.columnNumber Application.Cursor = xlNormal End Sub
Ещё полезная штука, если ищете в файле что-то конкретное и не нужно проходить до конца файла, когда это что-то нашли, то в Sub IVBSAXContentHandler_startDocument добавляете [vba]
Код
mStopParsing = False
[/vba]
В самое начало Sub IVBSAXContentHandler_startElement добавляете [vba]
Код
If mStopParsing Then Exit Sub
[/vba]
И там, где ожидаете найти то, что искали добавляете [vba]
Код
mStopParsing = True
[/vba]
Этот способ всего лишь отключает парсинг, но не прекращает считывание файла. Наверняка есть какой-то более эффективный способ остановить работу процедуры, но я его не нашёл.
Ещё полезная штука, если ищете в файле что-то конкретное и не нужно проходить до конца файла, когда это что-то нашли, то в Sub IVBSAXContentHandler_startDocument добавляете [vba]
Код
mStopParsing = False
[/vba]
В самое начало Sub IVBSAXContentHandler_startElement добавляете [vba]
Код
If mStopParsing Then Exit Sub
[/vba]
И там, где ожидаете найти то, что искали добавляете [vba]
Код
mStopParsing = True
[/vba]
Этот способ всего лишь отключает парсинг, но не прекращает считывание файла. Наверняка есть какой-то более эффективный способ остановить работу процедуры, но я его не нашёл.igor2239
Сообщение отредактировал igor2239 - Вторник, 09.04.2019, 19:09
Добрый день! В продолжение темы возник ещё вопрос по чтению атрибутов. Ниже примеры файлов: 1.XML и 2.XML. С чтением файла 1.XML разобрались (см. выше). А как прочитать файл 2.XML? 1.XML [vba]
Добрый день! В продолжение темы возник ещё вопрос по чтению атрибутов. Ниже примеры файлов: 1.XML и 2.XML. С чтением файла 1.XML разобрались (см. выше). А как прочитать файл 2.XML? 1.XML [vba]