:: Visual Foxpro, Foxpro for DOS
Распарсить XML-файл
sphinx
Автор

Сообщений: 31179
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Коллеги, не получается распарсить XML-файл (прикреплен к сообщению), по структуре должен быть правильным, проверить на валидность было нечем (где Татьяна? у нее теперь есть отличный валидатор!).

#DEFINE XML_FILE 'C:\out.xml'
LOCAL oXML as MSXML2.DomDocument
oXML = CREATEOBJECT('MSXML2.DomDocument.4.0')
IF VARTYPE(oXML)<>'O'
MESSAGEBOX('Не создан MSXML.DOMDocument!', 16, 'Ошибка')
RETURN .F.
ENDIF
oXML.async = .F.
IF !oXML.LoadXML(XML_FILE) && ---------> возвращает .F. (!)
MESSAGEBOX('Файл не содержит данных!!', 16, 'Ошибка')
RETURN .F.
ENDIF
*--- < skip > --
RETURN


Буду рад комментариям и советам.


------------------
"Veni, vidi, vici!"(с)




Исправлено 1 раз(а). Последнее : sphinx, 28.01.20 17:31
Ratings: 0 negative/0 positive
Re: Распарсить XML-файл
_vit

Сообщений: 5175
Дата регистрации: 29.07.2002
IF !oXML.LoadXML(XML_FILE)
IF !oXML.Load(XML_FILE)
Ratings: 0 negative/0 positive
Re: Распарсить XML-файл
sphinx
Автор

Сообщений: 31179
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Так тоже пробовал - создает объект, только пустой.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Распарсить XML-файл
Владимир Максимов

Сообщений: 14098
Откуда: Москва
Дата регистрации: 02.09.2000
Я не в курсе, но разве такая структура XML это нормально?

+<art id="item_2">
+<form id="form_1">
+<route id="item_3">
+<form id="form_2">
+<template id="item_4">
+<form id="form_3">
+<stringelement id="item_5">
+<form id="form_4">
+<stringelement id="item_6">

Разве не должны эти элементы быть вложены друг в друга? Или это какой-то новый формат?

Не знаю, что там задумывалось, но, как минимум, должно быть что-то вроде

+<art id="item_2">
<forms>
+<form id="form_1">
+<form id="form_2">
+<form id="form_3">
+<form id="form_4">
</forms>
<routes>
+<route id="item_3">
</routes>
<templates>
+<template id="item_4">
</templates>
<stringelements>
+<stringelement id="item_5">
+<stringelement id="item_6">
</stringelements>

Ну, или как-то по другому выстроить дерево. Но не должны быть однотипные узлы вперемешку на одном уровне
Ratings: 0 negative/0 positive
Re: Распарсить XML-файл
sphinx
Автор

Сообщений: 31179
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Все-таки валидность файла... Спасибо.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Распарсить XML-файл
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Владимир Максимов
Я не в курсе, но разве такая структура XML это нормально?
Абсолютно допустимо. Файл синтаксически корректный (валидный) и без проблем загружается в парсер.
А уж как его авторы решили структуру задавать - есть сугубо их личное дело.
Владимир Максимов
Но не должны быть однотипные узлы вперемешку на одном уровне
Почему бы нет?


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Распарсить XML-файл
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
sphinx
Буду рад комментариям и советам.

У меня жрёт.
CLEAR
lcFileName = "out.xml"
LOCAL oXML as MSXML2.DomDocument
oXML = CREATEOBJECT('MSXML2.DomDocument.4.0')
IF VARTYPE(oXML)<>'O'
MESSAGEBOX('Не создан MSXML.DOMDocument!', 16, 'Ошибка')
RETURN .F.
ENDIF
oXML.async = .F.
lcContents = FILETOSTR(lcFileName)
IF !oXML.LoadXML(lcContents) && Текст ему здесь нужен
MESSAGEBOX('Файл не содержит данных!!', 16, 'Ошибка')
RETURN .F.
ENDIF
loDoc = oXML.documentElement
loArt = oXML.SelectNodes("//intermech/art/occurrence")
?loArt.Length
FOR EACH loObj IN loArt
FOR EACH loAttr IN loObj.Attributes
?loAttr.NodeName
?loAttr.NodeValue
NEXT
NEXT
Ratings: 0 negative/0 positive
Re: Распарсить XML-файл
akvvohinc

Сообщений: 4218
Откуда: Москва
Дата регистрации: 11.11.2008
sphinx
Буду рад комментариям и советам.
LoadXML собирается принять строку с данными, а ты даешь строку с именем файла с данными.
Ratings: 0 negative/0 positive
Re: Распарсить XML-файл
akvvohinc

Сообщений: 4218
Откуда: Москва
Дата регистрации: 11.11.2008
sphinx
Так тоже пробовал - создает объект, только пустой.
Метод Load не создает объект - он должен загрузить данные из файла в свойство Xml того же объекта, вот значение этого свойства и надо проверять.



Исправлено 1 раз(а). Последнее : akvvohinc, 30.01.20 17:08
Ratings: 0 negative/0 positive
Re: Распарсить XML-файл
sphinx
Автор

Сообщений: 31179
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Да все получилось, немного с моделью напутал...
Раз ИК утверждал, что файл валидный - сегодня (!) получил XSD-схему:

java.exe -jar trang.jar -I xml -O xsd OUT.XML OUT.XSD
trang.jar берем здесь relaxng.org




Увы, по готовой XSD-схеме получить коллекцию .Tables через XMLAdapter не получилось - ошибка "Schema is too complex".



------------------
"Veni, vidi, vici!"(с)




Исправлено 1 раз(а). Последнее : sphinx, 30.01.20 17:34
Ratings: 0 negative/0 positive
Re: Распарсить XML-файл
sphinx
Автор

Сообщений: 31179
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Спасибо, друзья!
Так всегда, как только коллеги ковыряют проблему - решение находится, или признаешься, что был "под стулом стук", и нашел проблему там, где ее не было.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Распарсить XML-файл
sphinx
Автор

Сообщений: 31179
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Владимир Максимов
Но не должны быть однотипные узлы вперемешку на одном уровне

Все правильно - не должно быть! Ибо связи (если внимательно посмотреть на XML-файл) построены через ключи типа "item_4", "form_5" и пр. Описания на такие связи нет, и полей таких в СУБД тоже. Очень непросто разобраться, какими запросами можно потом выбрать нужные данные, но вроде получается. При иерархии все было бы прозрачно, IMHO.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 32 Каратаев DmitryKn  (Гостей: 30)

© 2000-2024 Fox Club 
Яндекс.Метрика