Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Чтение больших XML с использованием API SAX - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Чтение больших XML с использованием API SAX
sgkorolew Дата: Понедельник, 01.04.2019, 18:22 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 107
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Добрый день.
Решил попробовать прочитать большой 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.xlsm (14.4 Kb) · XML.xml (0.4 Kb)


Сообщение отредактировал sgkorolew - Понедельник, 01.04.2019, 18:33
 
Ответить
СообщениеДобрый день.
Решил попробовать прочитать большой 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]

Автор - sgkorolew
Дата добавления - 01.04.2019 в 18:22
sgkorolew Дата: Суббота, 06.04.2019, 16:00 | Сообщение № 2
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 107
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Добрый день!
Пока, к сожалению, ни у кого не нашлось примеров кода. Добавляйте, пожалуйста.
Выкладываю, что получилось у меня.
К сообщению приложен файл: XML.xlsm (21.6 Kb)
 
Ответить
СообщениеДобрый день!
Пока, к сожалению, ни у кого не нашлось примеров кода. Добавляйте, пожалуйста.
Выкладываю, что получилось у меня.

Автор - sgkorolew
Дата добавления - 06.04.2019 в 16:00
igor2239 Дата: Вторник, 09.04.2019, 18:56 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 1 ±
Замечаний: 0% ±

Excel 2016
Обычно ещё добавляют модуль класса 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]


Сообщение отредактировал igor2239 - Вторник, 09.04.2019, 19:08
 
Ответить
СообщениеОбычно ещё добавляют модуль класса 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]

Автор - igor2239
Дата добавления - 09.04.2019 в 18:56
igor2239 Дата: Вторник, 09.04.2019, 19:07 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 1 ±
Замечаний: 0% ±

Excel 2016
Ещё полезная штука, если ищете в файле что-то конкретное и не нужно проходить до конца файла, когда это что-то нашли, то в Sub IVBSAXContentHandler_startDocument добавляете
[vba]
Код
mStopParsing = False
[/vba]

В самое начало Sub IVBSAXContentHandler_startElement добавляете
[vba]
Код
If mStopParsing Then Exit Sub
[/vba]

И там, где ожидаете найти то, что искали добавляете
[vba]
Код
mStopParsing = True
[/vba]

Этот способ всего лишь отключает парсинг, но не прекращает считывание файла. Наверняка есть какой-то более эффективный способ остановить работу процедуры, но я его не нашёл.


Сообщение отредактировал igor2239 - Вторник, 09.04.2019, 19:09
 
Ответить
СообщениеЕщё полезная штука, если ищете в файле что-то конкретное и не нужно проходить до конца файла, когда это что-то нашли, то в Sub IVBSAXContentHandler_startDocument добавляете
[vba]
Код
mStopParsing = False
[/vba]

В самое начало Sub IVBSAXContentHandler_startElement добавляете
[vba]
Код
If mStopParsing Then Exit Sub
[/vba]

И там, где ожидаете найти то, что искали добавляете
[vba]
Код
mStopParsing = True
[/vba]

Этот способ всего лишь отключает парсинг, но не прекращает считывание файла. Наверняка есть какой-то более эффективный способ остановить работу процедуры, но я его не нашёл.

Автор - igor2239
Дата добавления - 09.04.2019 в 19:07
sgkorolew Дата: Четверг, 11.04.2019, 19:01 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 107
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
igor2239, спасибо за дополнения.
 
Ответить
Сообщениеigor2239, спасибо за дополнения.

Автор - sgkorolew
Дата добавления - 11.04.2019 в 19:01
sgkorolew Дата: Понедельник, 29.04.2019, 16:52 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 107
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Добрый день!
В продолжение темы возник ещё вопрос по чтению атрибутов.
Ниже примеры файлов: 1.XML и 2.XML.
С чтением файла 1.XML разобрались (см. выше).
А как прочитать файл 2.XML?
1.XML
[vba]
Код
<Документ>
    <Запись>
         <НомерПП>1</НомерПП>
         <Фамилия>ИВАНОВ</Фамилия>
         <Имя>ИВАН</Имя>
         <Отчество>ИВАНОВИЧ</Отчество>
         <Договор>123456789</Договор>
         <Сумма>1000000</Сумма>
    </Запись>
</Документ>
[/vba]
2.XML
[vba]
Код
<Документ><Запись НомерПП="1" Фамилия="ИВАНОВ" Имя="ИВАН" Отчество="ИВАНОВИЧ" Договор="123456789" Сумма="1000000" /></Документ>
[/vba]


Сообщение отредактировал sgkorolew - Понедельник, 29.04.2019, 16:55
 
Ответить
СообщениеДобрый день!
В продолжение темы возник ещё вопрос по чтению атрибутов.
Ниже примеры файлов: 1.XML и 2.XML.
С чтением файла 1.XML разобрались (см. выше).
А как прочитать файл 2.XML?
1.XML
[vba]
Код
<Документ>
    <Запись>
         <НомерПП>1</НомерПП>
         <Фамилия>ИВАНОВ</Фамилия>
         <Имя>ИВАН</Имя>
         <Отчество>ИВАНОВИЧ</Отчество>
         <Договор>123456789</Договор>
         <Сумма>1000000</Сумма>
    </Запись>
</Документ>
[/vba]
2.XML
[vba]
Код
<Документ><Запись НомерПП="1" Фамилия="ИВАНОВ" Имя="ИВАН" Отчество="ИВАНОВИЧ" Договор="123456789" Сумма="1000000" /></Документ>
[/vba]

Автор - sgkorolew
Дата добавления - 29.04.2019 в 16:52
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!