:: Visual Foxpro, Foxpro for DOS
Требуется помощь с XML и его разбором в XMLAdapter'e
Bobr
Автор

Сообщений: 1790
Откуда: Глухов
Дата регистрации: 21.11.2006
Всем доброго времени суток!
Эпопея с ПриветБанком продолжается.

Итак, вот XMLина из их примеров:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Transfer xmlns="http://debt.privatbank.ua/Transfer" interface="Debt" action="Presearch">
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Payer">
<Unit name="street" value="213434"/>
<Unit name="house" value="34" />
</Data>
</Transfer>

при попытке втянуть в XMLAdapter.loadXML этое все как есть - получаю ошибку об отсутствии типа Payer в схеме www.w3.org(ну или что-то вроде того), потому кусок

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:

я из него вырезаю, получая вот:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Transfer xmlns="http://debt.privatbank.ua/Transfer" interface="Debt" action="Presearch">
<Data type="Payer">
<Unit name="street" value="213434"/>
<Unit name="house" value="34" />
</Data>
</Transfer>
и эта штука уже нормально втягивается
дальше следующий код
код, вроде как, простее некуда, но увы - на выходе получаем пустые курсоры. от слова совсем.

через вот так
iXml = xml_adapter.IXMLDOMElement
данные достать получается, но это ж капец как неудобно, тем более, когда количество строк/записей заранее неизвестно...

может кто подсказать, ЧЯДНТ?
Ratings: 0 negative/0 positive
Re: Требуется помощь с XML и его разбором в XMLAdapter'e
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Схему "http://debt.privatbank.ua/Transfer" не находит, вот он и ругается... Подсунь ему правильный xsd.
Вообще такая модификация XML некорректна. Кроме того, если уж избавляться от пространств имён, то кардинально - зачем оставил xmlns="http://debt.privatbank.ua/Transfer" в документе? Это задаёт пространство имён по умолчанию...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Требуется помощь с XML и его разбором в XMLAdapter'e
Bobr
Автор

Сообщений: 1790
Откуда: Глухов
Дата регистрации: 21.11.2006
Igor Korolyov
Подсунь ему правильный xsd.
можно на пальцах, как это правильно сделать?

Igor Korolyov
зачем оставил xmlns="http://debt.privatbank.ua/Transfer" в документе?
то есть, если убрать xmlns="http://debt.privatbank.ua/Transfer", и сделать:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Transfer interface="Debt" action="Presearch">
<Data type="Payer">
<Unit name="street" value="213434"/>
<Unit name="house" value="34" />
</Data>
</Transfer>
- то все должно будет втянуться корректно?

Igor Korolyov
Это задаёт пространство имён по умолчанию...
ну, так а что не так? вроде ж пространство имен задано в корневом элементе, то есть для всего документа оно одинаково, как оно может негативно влиять?
Ratings: 0 negative/0 positive
Re: Требуется помощь с XML и его разбором в XMLAdapter'e
Bobr
Автор

Сообщений: 1790
Откуда: Глухов
Дата регистрации: 21.11.2006
почитал здесь www.w3schools.com про XSD-схемы. все, в принципе, понятно. но блин, это мне на их XMLи еще и схемы ваять? неужели нет более easy way?
Ratings: 0 negative/0 positive
Re: Требуется помощь с XML и его разбором в XMLAdapter'e
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Построчный разбор текстового файла (правда, на строки надо еще разбить XML иногда), с отслеживанием текущего, составного, тега
Штатным образом это называется как-то... щас посмотрю в ИЕ... SAX - типа на каждой строке (тэге) вызываем подпрограмму. Подпрограмме передаем полное составное имя тега, состоящее из собственно имени тэга, и имен в которые он входит, и собственно содержимое тэга конечно )

Доб. (я зарекался о XML не говорить, развязался зачем-то)



Исправлено 1 раз(а). Последнее : of63, 20.01.17 20:59
Ratings: 1 negative/0 positive
Re: Требуется помощь с XML и его разбором в XMLAdapter'e
Bobr
Автор

Сообщений: 1790
Откуда: Глухов
Дата регистрации: 21.11.2006
2 of63
OMG, лучше уж я схемы для каждого из 8 случаев сделаю...
Ratings: 0 negative/0 positive
Re: Требуется помощь с XML и его разбором в XMLAdapter'e
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
Bobr
почитал здесь www.w3schools.com про XSD-схемы. все, в принципе, понятно. но блин, это мне на их XMLи еще и схемы ваять? неужели нет более easy way?
Есть. Попросить их у авторов.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Требуется помощь с XML и его разбором в XMLAdapter'e
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Схемы, как правило, предоставляет тот же кто и работает потом с этими XML-ями. По сути схема это формальное описание того как именно должен выглядеть XML. Что, где, какие обязательные элементы, какие нет...

Если заморачиваться "ручным" созданием всех этих XMLTable да XMLField-ов, и забить на валидацию XML-я, то сама по себе xsd схема и не нужна.
Например для приведенного документа вот такой код работает:

Для извлечения данных из собственно корневого элемента приходится немного трюкачить... Ну и атрибут вынуть с "чужим" пространством имён тоже нельзя напрямую (это уже ограничение фокса - не позволяет он для поля задавать нэймспейс отличный от такового у самой таблицы)...


------------------
WBR, Igor




Исправлено 1 раз(а). Последнее : Igor Korolyov, 21.01.17 14:00
Ratings: 0 negative/0 positive
Re: Требуется помощь с XML и его разбором в XMLAdapter'e
Bobr
Автор

Сообщений: 1790
Откуда: Глухов
Дата регистрации: 21.11.2006
2 ssa
сомневаюсь я, что в таком энтырпрайзе, как ПриветБанк, кто-то хоть пальцем пошевелит для того, чтобы какому-то неизвестному мне искать какие-то там схемы(если они вообще есть) для XMLьного АПИ

2 Igor Korolyov
Честно говоря, работа с XMLAdapter меня порой удивляет до глубины души: когда думаешь, что уже вот со всем разобрался - тут на тебе, видишь, что нихрена и не разобрался особо. Итак, поехали:

зачем XMLAdapter'у назначать XMLName
xml_adapter.XMLNAME = STRCONV("Transfer", 5)
и обязательное ли это условие в принципе, при разборе любого XMLя?

так ли критично для моего документа указывать
xml_adapter.XMLNAMESPACE = STRCONV("http://debt.privatbank.ua/Transfer", 5)
если неймспейс все равно один на весь документ?

почему для элемента Transfer нужно указыать, что он - XMLNAMEISXPATH?
xml_tab.XMLNAMEISXPATH = .T.

штоэта? для чего все эти звездочки-собачки-скобочки?
xml_field.XMLNAME = STRCONV("@*[local-name()='type']", 5)

почему элемент Type тоже должен быть XMLNAMEISXPATH?

нужно ли вырезать вот это
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:
чтобы ваш код отработал? (к сожалению, сегодня я до кода вряд-ли доберусь....)
Ratings: 0 negative/0 positive
Re: Требуется помощь с XML и его разбором в XMLAdapter'e
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
Bobr
2 ssa сомневаюсь я, что в таком энтырпрайзе, как ПриветБанк, кто-то хоть пальцем пошевелит для того, чтобы какому-то неизвестному мне искать какие-то там схемы(если они вообще есть) для XMLьного АПИ
Вы опять демонстрируете очень плохое знание предмета...

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Требуется помощь с XML и его разбором в XMLAdapter'e
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Bobr
зачем XMLAdapter'у назначать XMLName
Необязательно на самом деле, фокс весьма своеобразно "разбирает" XML... Но по сути именно таково имя корневого элемента в этом документе.
Bobr
так ли критично для моего документа указывать
xml_adapter.XMLNAMESPACE = STRCONV("http://debt.privatbank.ua/Transfer", 5)
если неймспейс все равно один на весь документ?
Да, критично. Потому что он у некоторых элементов документа ЕСТЬ. А не укажешь - фокс будет искать элементы с пустым нэймспейсом, и ничего не найдёт.
Bobr
почему для элемента Transfer нужно указыать, что он - XMLNAMEISXPATH?
Потому что в его XMLName указан именно XPath, а не "имя узла". Не знаю как по другому достучаться до КОРНЕВОГО узла в дереве - при указании просто имени фокс ищет только внутренние узлы.
Bobr
штоэта? для чего все эти звездочки-собачки-скобочки?
xml_field.XMLNAME = STRCONV("@*[local-name()='type']", 5)
почему элемент Type тоже должен быть XMLNAMEISXPATH?
Ну тут я читать курс по XPath точно не стану... И свойство опять же говорит что в XMLName находится XPath выражение, а не банальное "имя узла или атрибута". Данное выражение выбирает атрибут текущего узла у которого "локальное имя" (имя без нэймспейса) совпадает с заданной строкой.
Bobr
нужно ли вырезать вот это
Нет, именно поэтому данный атрибут вынимается таким XPath выражением - чтобы проигнорировать пространство имён "http://www.w3.org/2001/XMLSchema-instance" заданное для этого атрибута - т.к. фокс не сможет напрямую достать данные из узла с одним нэймспейсом но атрибута с другим.

Всё дело в том, что модифицировать xml "как просто текст" это последнее дело - запросто можно накосячить, т.к. семантически такой-же документ может запросто прийти в синтаксически другой форме - ну банально не пробел будет между атрибутами xmlns:xsi и xsi:type а перевод строки, и/или табуляторы, или появится ещё атрибут "между" этими двумя... Твой код не сработает, хотя по сути в документе "ничего и не изменилось".


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Требуется помощь с XML и его разбором в XMLAdapter'e
Bobr
Автор

Сообщений: 1790
Откуда: Глухов
Дата регистрации: 21.11.2006
Решил попробовать "единичные" значения, типа action="Presearch" и type="Payer" доставать с помощью
iXml = xml_adapter.IXMLDOMElement
но появился еще один непонятный нюанс: похоже, оно не хочет понимать выражения XPath, потому что вот этот код
tElement = iXml.selectSingleNode('//Data')
?tElement
возвращает NULL
следующий код, правда, возвращает корневую ноду Transfer
tElement = iXml.selectSingleNode('*')
?tElement
?tElement.context.nodeName

любое из нижеследующих выражений возвращает NULL
tElement = iXml.selectSingleNode('/Data')
?tElement
tElement = iXml.selectSingleNode("child:ata")
?tElement
tElement = iXml.selectSingleNode("descendant:ata")
?tElement

а вот это, выражение, внезапно, возвращает то, что нужно
tElement = iXml.selectSingleNode("child::*")
?tElement
?tElement.nodeName && returns Data

а это так же внезапно возвращает коренную ноду, хотя должен быть, по идее, массив "детей"
tElement = iXml.selectNodes("child::*")
?tElement.context.nodeName

я опять что-то не так готовлю?
Ratings: 0 negative/0 positive
Re: Требуется помощь с XML и его разбором в XMLAdapter'e
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Опять забыли напрочь про пространства имён...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Требуется помощь с XML и его разбором в XMLAdapter'e
Bobr
Автор

Сообщений: 1790
Откуда: Глухов
Дата регистрации: 21.11.2006
Igor Korolyov
Опять забыли напрочь про пространства имён...
ээмммм? недопонял...
ну, загружаю я XML вашим же способом
xml_adapter = CREATEOBJECT("XMLAdapter")
xml_adapter.LOADXML("test.xml", .T., .F.)
xml_adapter.XMLNAMESPACE = STRCONV("http://debt.privatbank.ua/Transfer", 5)
xml_adapter.XMLNAME = STRCONV("Transfer", 5)

а дальше
iXml = xml_adapter.IXMLDOMElement

что же я делаю не так?
Ratings: 0 negative/0 positive
Re: Требуется помощь с XML и его разбором в XMLAdapter'e
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
XMLNAMESPACE свойство адаптера, с чего бы это ему влиять на DOMDocument который этот адаптер ИСПОЛЬЗУЕТ (да ещё и до того как он реально начнёт его использовать для "разбора")? DomDocument и адаптер это 2 разные вещи.

Если стоит задача работать с DomDocument, то я бы вообще не стал использовать XMLAdapter.
Как задать SelectionNamespaces (на самом деле ещё и SelectionLanguage) для DomDocument можно найти в поиске. Как повлияет это задание для объекта связанного с XMLAdapter я не в курсе - может он сломается, может просто "перепишет" эти свойства при выполнении последующих ToCursor()... В общем ещё раз отмечу - если предполагается разбирать XML вручную, не используя XMLTable.ToCursor(), то и грузить XML в адаптер не нужно - грузи его прямо в MSXML2.DomDocument.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Требуется помощь с XML и его разбором в XMLAdapter'e
Bobr
Автор

Сообщений: 1790
Откуда: Глухов
Дата регистрации: 21.11.2006
Igor Korolyov
Как задать SelectionNamespaces (на самом деле ещё и SelectionLanguage) для DomDocument можно найти в поиске.
уже нашел и пытался прикрутить к IXMLDOMElement адаптера, так как мне почему-то думалось, что это и есть "завуалированно" созданный MSXML2.DomDocument, а не
Igor Korolyov
2 разные вещи
и что адаптер устанавливает свойства и для IXMLDOMElement'a...
Igor Korolyov
Как повлияет это задание для объекта связанного с XMLAdapter я не в курсе - может он сломается, может просто "перепишет" эти свойства при выполнении последующих ToCursor()...
никак. метод setProperty() "появляется" только у нод, но при попытке записать SelectionNamespaces или SelectionLanguage - вываливает ошибку Not Implemented(ну еще бы - зачем оно ноде?), а у IXMLDOMElement такого метода нету, хотя у MSXML2.DomDocument он есть.

видать действительно, лучше эти "одиночности" буду доставать через MSXML2.DomDocument, а бОльшие табличные массивы буду разбирать адаптером. спасибо за пинок в нужном направлении
Ratings: 0 negative/0 positive
Re: Требуется помощь с XML и его разбором в XMLAdapter'e
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Bobr
уже нашел и пытался прикрутить к IXMLDOMElement адаптера, так как мне почему-то думалось, что это и есть "завуалированно" созданный MSXML2.DomDocument
Это и есть созданный внутри адаптера DomDocument - только не он сам, а его documentElement (по сути корневой элемент). Из ссылки на такой объект в свойстве IXMLDOMElement адаптера через свойство .ownerDocument можно получить ссылку и на "подлежащий" объект DomDocument. Только дело в том, что этим объектом управляет сам адаптер, и потому не стоит в него лезть без особой нужды, и, тем паче, не понимая как и что изменится от нашего вмешательства...
Bobr
метод setProperty() "появляется" только у нод, но при попытке записать SelectionNamespaces или SelectionLanguage - вываливает ошибку Not Implemented(ну еще бы - зачем оно ноде?), а у IXMLDOMElement такого метода нету, хотя у MSXML2.DomDocument он есть.
Методы getProperty/setProperty имеются в интерфейсах IXMLDOMDocument2 и IXMLDOMDocument3 - эти интерфейсы реализует класс DOMDocumentXX (в разных версиях парсера разные "имена" класса, и они реализуют разные интерфейсы. В 6-м парсере это IXMLDOMDocument3, в 3-м IXMLDOMDocument2 - но в данном случае это не имеет значения). Естественно что "элемент" и "документ" это разные классы, и у "элемента" нет этих методов, и нет возможности управлять глобальным поведением объекта "документ". От элемента перейти к объекту документ (из которого получен этот элемент) обычно можно через свойство ownerDocument.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Требуется помощь с XML и его разбором в XMLAdapter'e
makar12

Сообщений: 1
Откуда: Москва
Дата регистрации: 01.02.2017
2 Bobr, неужели нет более easy way?

Делал что то похожее 2 года назад.
Два дня искал "easy way" ,не нашёл,
и написал свой парсер, который работает до сих пор.
НО,
совсем недавно наткнулся на "nfXML"
vfpx.codeplex.com

Интересные примеры,и не только для XML.
В твоём случае это будет выглядеть так:

*==========================================
clear
cMap = ''
m.cXml= 'PrivetBank.xml'
m.oXml = nfXmlRead( m.cXml,.F.,.F.,@cMap )

For Each unit In m.oXml.transfer.data.unit
? unit._attr_.name,unit._attr_.value
EndFor
? cMap = ''
*==========================================

На последнюю строчку ставишь точку прерывания,
а в дебагер выводишь объект "m.oXml"
Всё как на ладони ...
Ratings: 0 negative/0 positive
Re: Требуется помощь с XML и его разбором в XMLAdapter'e
Bobr
Автор

Сообщений: 1790
Откуда: Глухов
Дата регистрации: 21.11.2006
2 makar12
спасибо огромное за наводку - скачал, положил в "копилку"

а свое я уже на питоне реализовал. осталось только "в кучку" собрать, да только внезапно другими "срочными задачами неимоверной важности" меня пригрузили...
Ratings: 0 negative/0 positive
Re: Требуется помощь с XML и его разбором в XMLAdapter'e
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Ну этот то автор хотя-бы в основу положил стандартный MSXML парсер (правда древней 3-й версии)... Не гениальничал с FREAD() или STREXTRACT() как некоторые

А так - IMHO весьма сомнительная польза от данной обёртки. Как раз таки ПРОЩЕ и логичнее самому с DOM представлением работать, и через Select* методы получать то что нужно не прибегая ни к полным путям, ни к созданию кучи ненужных empty объектов (при том что сам по себе DOM парсер уже насоздавал кучу объектов для каждого узла и каждого атрибута в разобранном XML-е - посему он не лучший вариант для работы с мегабайтными XML-ями), ещё и с неизвестно какими именами, т.к. автор похоже вообще не в курсе что такое пространства имён и чем они отличаются от префиксов


------------------
WBR, Igor
Ratings: 0 negative/0 positive


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

On-line: 49 Rifat  (Гостей: 48)

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