Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Разбор XML / 25 сообщений из 39, страница 1 из 2
30.12.2011, 13:25
    #37600237
alm2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
Есть XML файл

В нем есть ТЭГ "USL"

Который имеет набор тегов "ID_1" , "ID_2" и других

<USL>
<ID_1>1 </ID_1>
<ID_2>11 </ID_2>
...
</USL>
<USL>
<ID_1>2 </ID_1>
<ID_2>22 </ID_2>
...
</USL>


<USL>
<ID_1>3 </ID_1>
<ID_2>33 </ID_2>
...
</USL>

Нужно получить с помощью 'msxml2.DomDocument.3.0'


dbf таблицу USL с полями ID_1,ID_2


xmlobj=CREATEOBJECT('msxml2.DomDocument.3.0')
xmlobj.load(ALLTRIM(m.xmlFileName))

..... ??? ....

Посоветуйте как ?

Через Адаптер не нужно.
описанный пример - это необходимый мне фрагмент для решения большой другой задачи
...
Рейтинг: 0 / 0
30.12.2011, 14:05
    #37600290
Grin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
loXML = CREATEOBJECT("MSXML.DOMDocument")
loXML.ASYNC=.F.
loXML.load(m.xml_link)
IF loXML.parseError.errorCode<>0
m.ans=MESSAGEBOX('Ошибка получения данных от сервиса '+CHR(13)+'Код ошибки: '+ALLTRIM(STR(loXML.parseError.errorCode))+CHR(13)+'Описание ошибки: '+loXML.parseError.srcText+CHR(13)+'Продолжить обработку??',20,'Ошибка!')
IF m.ans<>6
RETURN
ENDIF
ENDIF

loXMLNodes=loXML.getElementsByTagName("SearchStatus")
loNodes = loXMLNodes.nextNode
m.IdCode=loNodes.getElementsByTagName("IdCode").item(0).text
m.SecondName=loNodes.getElementsByTagName("SecondName").item(0).text
m.FirstName=loNodes.getElementsByTagName("FirstName").item(0).text
m.MiddleName=loNodes.getElementsByTagName("MiddleName").item(0).text
RELEASE loNodes
RELEASE loXMLNodes
RELEASE loXML
...
Рейтинг: 0 / 0
01.01.2012, 09:32
    #37601163
alm2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
Спасибо за ответ

Утояняю - необх учесть ID_PAC внешнего ТЭГА

Есть XML файл:

В нем есть ТЭГи "PAC" , "USL"



<PAC>
<ID_PAC>1</ID_PAC>
<USL>
<ID_USL>1 </ID_USL>
...
</USL>
<USL>
<ID_USL>2 </ID_USL>
...
</USL>
<USL>
<ID_USL>3</ID_USL>
...
</USL>
</PAC>

<PAC>
<ID_PAC>2</ID_PAC>
<USL>
<ID_USL>1 </ID_USL>
...
</USL>
<USL>
<ID_USL>2 </ID_USL>
...
</USL>
<USL>
<ID_USL>3</ID_USL>
...
</USL>
</PAC>








Нужно получить с помощью 'msxml2.DomDocument.3.0'


dbf таблицу USL с полями ID_PAC, ID_USL

-----------------------
id_pac : id_usl
--------------------------
1 ............1
1............ 2
1.............3
2.............1
2.............2
2.............3



В Вашем примере нет цикла для обхода всех ТЭГОВ <PAC>
...
Рейтинг: 0 / 0
03.01.2012, 17:05
    #37601506
Grin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
Да Вы батенька лентяй ....

у меня нету опыта работы с XML но поковырявшись 30 мин получился следующий код

Имеем следующий XML
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
<Test_xml>
<PAC>
	<ID_PAC>1</ID_PAC>
	<USL>
		<ID_USL>1 </ID_USL>
	</USL>
	<USL>
		<ID_USL>2 </ID_USL>
	</USL>
	<USL>
		<ID_USL>3</ID_USL>
	</USL>
	<USL>
		<ID_USL>3</ID_USL>
	</USL>
	<USL>
		<ID_USL>3</ID_USL>
	</USL>
</PAC>
<PAC>
	<ID_PAC>2</ID_PAC>
	<USL>
		<ID_USL>1 </ID_USL>
	</USL>
	<USL>
		<ID_USL>2 </ID_USL>
	</USL>
	<USL>
		<ID_USL>5</ID_USL>
	</USL>
	<USL>
		<ID_USL>7</ID_USL>
	</USL>
	<USL>
		<ID_USL>3</ID_USL>
	</USL>
</PAC>
</Test_xml>




Ну и парсим его таким кодом
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CREATE CURSOR test_xml (id_pac int,id_usl int)

loXML = CREATEOBJECT("msxml2.DomDocument.3.0")
loXML.ASYNC=.F.
loXML.load("D:\......\txml1.xml")

loXMLNodes=loXML.getElementsByTagName("Test_xml/PAC")
loNodes = loXMLNodes.nextNode
FOR i=1 TO loXMLNodes.length
	m.id_pac=loNodes.getElementsByTagName("ID_PAC").item(0).text
	loNodes2 = loXMLNodes2.nextNode
	FOR i2=1 TO loXMLNodes2.item(0).childNodes.length-1
		m.id_usl=loXMLNodes2.item(i-1).childNodes.item(i2).text
		SELECT test_xml 
		APPEND BLANK 
		GATHER MEMVAR 
		loNodes2 = loXMLNodes2.nextNode
	endf 
	loNodes = loXMLNodes.nextNode
endf 

RELEASE loXML 
SELECT test_xml 
brow



Повторюсь я с XML опыта работы не имею
скрипт написал за пол часа с перекуром и кофепитием
наверняка есть более правильные варианты разбора

не ленитесь пользоваться поиском по форуму
если не здесь, то на фоксклубе запрос типа вашего наверняка уже разжевывали
ну и не ждите что Вам всегда будут давать готовые решения, пробуйте разобраться сами
...
Рейтинг: 0 / 0
11.01.2012, 09:19
    #37608664
Koryuu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
2 alm2
Учитывая тэг USL и тот факт, что вы из Самары.... вы не пакет со счетом ОМС пытаетесь разобрать?
Если так, то можно воспользоваться ковертером, который МИАЦ написал. Корявый, долго работает, но если его рефокснуть, то внутри есть кусок кода, который позволяет полностью разобрать XML-ку
...
Рейтинг: 0 / 0
11.01.2012, 10:22
    #37608735
DV_RUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
alm2,

Может стоит посмотреть в сторону XMLTOCURSOR( )?
Как то и код короче в разы получится.
...
Рейтинг: 0 / 0
11.01.2012, 11:49
    #37608913
Koryuu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
2 DV_RUS
Если там реально пакет по ОМС, то XMLTOCURSOR не прокатит - слишком ветвистая структура. На FoxClub говорят, что такие XML-ки только ручками расковыривать.
...
Рейтинг: 0 / 0
13.01.2012, 11:49
    #37612657
DV_RUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
Koryuu,

Выгрузка в ФНС (НДФЛ-2) также идет в XML.
Структура очень ветвистая. А ПО у них Fox`овое.
Может, стоит в эту сторону посмотреть?
...
Рейтинг: 0 / 0
29.10.2012, 16:25
    #38017334
Дима1991
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
Grin, У меня возник подобный вопрос. нужно парсить файл с аналогичной структурой, но тегов побольше. Я Ваш код проверяю курсор оказывается пустым. С чем это связано?
...
Рейтинг: 0 / 0
29.10.2012, 20:05
    #38017705
Grin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
2Дима1991,

Да, похоже я там чегото потерял

попробуйте такой код
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
CREATE CURSOR test_xml (id_pac int,id_usl int)

loXML = CREATEOBJECT("msxml2.DomDocument.3.0")
loXML.ASYNC=.F.
loXML.load("D:\my documents\my prog\new\test_xml\txml1.xml")

loXMLNodes=loXML.getElementsByTagName("Test_xml/PAC")
loNodes = loXMLNodes.nextNode
FOR i=1 TO loXMLNodes.length
	m.id_pac=loNodes.getElementsByTagName("ID_PAC").item(0).text

	loXMLNodes2=loNodes.getElementsByTagName("USL")
	FOR i2=1 TO loXMLNodes2.length
		m.id_usl=loXMLNodes2.item(i2-1).text
		SELECT test_xml 
		APPEND BLANK 
		GATHER MEMVAR 
		loNodes2 = loXMLNodes2.nextNode
	endf 
	loNodes = loXMLNodes.nextNode
endf 

RELEASE loXML 
SELECT test_xml 
brow
...
Рейтинг: 0 / 0
30.10.2012, 09:56
    #38018101
Дима1991
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
Grin, сейчас работает. А как быть если структура немного сложнее. Например у меня такова структура:


<zl_list>

<zap>

<pacient>
<fam>Петров</fam>
<im>Сергей</im>
<ot>Михайлович</ot>
</pacient>

</zap>

</zl_list>

как создать курсор с данные из тега Pacient. Т.е. содержащая поля FAM,IM,OT. с этим не могу разобраться
...
Рейтинг: 0 / 0
30.10.2012, 10:17
    #38018140
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
Дима1991, добраться до ноды <pacient>, вытащить текст, скормить полученный текст xmltocursor-у. В теге "пациент" вложенных тегов нет, так что вот тут xmltocursor как раз подойдёт.
...
Рейтинг: 0 / 0
30.10.2012, 10:20
    #38018148
Дима1991
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
tanglir, в том то и дело что я не знаю как туда добраться. :)
...
Рейтинг: 0 / 0
30.10.2012, 10:25
    #38018154
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
USE IN SELECT('test_xml')
CREATE CURSOR test_xml (id_pac int,id_usl varchar(254))

loXML = CREATEOBJECT("msxml2.DomDocument.3.0")
loXML.ASYNC=.F.
loXML.load("D:\tmp\Новая папка\qwe.XML")

loXMLNodes=loXML.getElementsByTagName("zap")
loNodes = loXMLNodes.nextNode
FOR i1=1 TO loXMLNodes.length
    loXMLNodes2=loNodes.getElementsByTagName("pacient")
    FOR i2=1 TO loXMLNodes2.length
        m.usl=loXMLNodes2.item(i2-1).text
        INSERT INTO test_xml VALUES (i1,m.usl)
        loNodes2 = loXMLNodes2.nextNode
    endf 
    loNodes = loXMLNodes.nextNode
endf 

RELEASE loXML 
SELECT test_xml 
brow

Вот вам чуть пофиксенный пример Грина, дальше сами думайте.
...
Рейтинг: 0 / 0
30.10.2012, 10:46
    #38018206
Дима1991
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
tanglir, нет нет, он в поле id_usl выводит все содержимое тега pacient. А как сделать чтобы каждый подтег выводился в отдельном столбике. fam отдельно, im отдельно и т.д.
...
Рейтинг: 0 / 0
30.10.2012, 10:48
    #38018213
Дима1991
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
если вам не сложно подскажите как написать чтобы вот содержимое тега pacient выводилось в отдельных столбиках. я его разбирать буду потом и по аналогии делать для других тегов.
...
Рейтинг: 0 / 0
30.10.2012, 11:45
    #38018334
Дима1991
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
как разбирать отдельные теги внутри тега pacient? а то все теги в один столбик копируются если ваш код применять
...
Рейтинг: 0 / 0
30.10.2012, 12:10
    #38018374
Grin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
Дима1991,

В атаче xml с Вашей структурой, который нормально парситься

Дальше попробуйте на этом xml пошагово в окне command отработать

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
loXML = CREATEOBJECT("msxml2.DomDocument.3.0")
loXML.ASYNC=.F.
loXML.load("D:\.........\test.xml")
? loXML.parseError.errorCode  &&код ошибки парсинга xml
? loXML.parseError.reason  &&текст ошибки парсинга xml
? loXML.getElementsByTagName("zl_list/zap/pacient").item(0).text  &&смотрим содержимое тега pacient
? loXML.getElementsByTagName("zl_list/zap/pacient/fam").item(0).text &&смотрим содержимое тега fam
? loXML.getElementsByTagName("zl_list/zap/pacient/im").item(0).text &&смотрим содержимое тега im
? loXML.getElementsByTagName("zl_list/zap/pacient/ot").item(0).text &&смотрим содержимое тега ot
...
Рейтинг: 0 / 0
30.10.2012, 12:27
    #38018406
Дима1991
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
Grin, т.е вы имете ввиду после создания курсора НЕ ПИСАТЬ вот это:


loXMLNodes=loXML.getElementsByTagName("zap")
loNodes = loXMLNodes.nextNode
FOR i1=1 TO loXMLNodes.length
loXMLNodes2=loNodes.getElementsByTagName("pacient")
FOR i2=1 TO loXMLNodes2.length
m.usl=loXMLNodes2.item(i2-1).text
INSERT INTO test_xml VALUES (i1,m.usl)
loNodes2 = loXMLNodes2.nextNode
endf
loNodes = loXMLNodes.nextNode
endf


а сразу писать так?

? loXML.parseError.errorCode &&код ошибки парсинга xml
? loXML.parseError.reason &&текст ошибки парсинга xml
? loXML.getElementsByTagName("zl_list/zap/pacient").item(0).text &&смотрим содержимое тега pacient
? loXML.getElementsByTagName("zl_list/zap/pacient/fam").item(0).text &&смотрим содержимое тега fam
? loXML.getElementsByTagName("zl_list/zap/pacient/im").item(0).text &&смотрим содержимое тега im
? loXML.getElementsByTagName("zl_list/zap/pacient/ot").item(0).text &&смотрим содержимое тега ot
...
Рейтинг: 0 / 0
30.10.2012, 12:30
    #38018414
Дима1991
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
мне нужно в курсор вывести в отдельных столбиках fam,im,ot и еще другие поля.. вот это мне непонятно самое важное
...
Рейтинг: 0 / 0
30.10.2012, 12:37
    #38018436
Дима1991
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
Grin, а вы не можете написать код, который в курсор выведет поле fam и im допустим. в отдельных столбцах как таблица. я потом хочу разобрать этот код и остальное сам доделать.

создаю курсор:
CREATE CURSOR pacient ( ;
fam C(30), ;
im C(30))

вот он содержит два поля. помогите вывести в эти два поля данные из xml файла из тега pacient. этих тегов может быть 1 или 100 в такой структуре:
...
Рейтинг: 0 / 0
30.10.2012, 12:40
    #38018441
Дима1991
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
вот я так пишу не знаю правильно или нет:

CREATE CURSOR test_xml ( ;
fam C(30), ;
im C(30), ;
ot C(30))

loXML = CREATEOBJECT("msxml2.DomDocument.3.0")
loXML.ASYNC=.F.
loXML.load("D:\2.XML")

? loXML.parseError.errorCode
? loXML.parseError.reason
? loXML.getElementsByTagName("zl_list/zap/pacient").item(0).text
fam=loXML.getElementsByTagName("zl_list/zap/pacient/fam").item(0).text
im=loXML.getElementsByTagName("zl_list/zap/pacient/im").item(0).text
ot=loXML.getElementsByTagName("zl_list/zap/pacient/ot").item(0).text

RELEASE loXML
SELECT test_xml
brow
...
Рейтинг: 0 / 0
30.10.2012, 12:48
    #38018455
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
Дима1991tanglir, нет нет, он в поле id_usl выводит все содержимое тега pacientЭто был пример. Хотя выяснилось, что не всё так уж очевидно. Вот что-то работающее:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
*Create Cursor test_xml (id_pac Int,id_usl Varchar(254))
USE IN SELECT('qweasd')
USE IN SELECT('pacient')

loXML = Createobject("msxml2.DomDocument.3.0")
loXML.Async=.F.
loXML.Load("D:\tmp\Новая папка\qwe.XML")

create cursor qweasd (ну типы полей сами зададите, вам лучше знать, что там должно быть)
create cursor pacient (с той же структурой)


loXMLNodes=loXML.getElementsByTagName("zap")
loNodes = loXMLNodes.nextNode
For i1=1 To loXMLNodes.Length
  loXMLNodes2=loNodes.getElementsByTagName("pacient")
  For i2=1 To loXMLNodes2.Length
    m.xmldata='<?xml version = "1.0" encoding="Windows-1251" standalone="yes"?><vfpdata>';
      +loXMLNodes2.Item(i2-1).свойство;
      +'</vfpdata>'
/*а какое свойство - ну не всё ж мне писать, покумекайте сами, это довольно очевидно :)*/
    Xmltocursor(m.xmldata,'qweasd',8192)
    Insert Into pacient SELECT * FROM qweasd
    ZAP IN qweasd
    loNodes2 = loXMLNodes2.nextNode
  Endf
  loNodes = loXMLNodes.nextNode
Endf

Release loXML
Select pacient
Brow

В итоге получаем курсор с записями о пациентах. Вроде бы то самое, чего вам и хотелось.
...
Рейтинг: 0 / 0
30.10.2012, 12:54
    #38018470
Дима1991
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
tanglir, что делается в этой строке и что за свойство должно быть вы не можете сказать? Если бы я имел опыт работы с xml то было легче наверное, но я первый раз столкнулся с этим. Тем более я новичек в фоксе, знаю не много

m.xmldata='<?xml version = "1.0" encoding="Windows-1251" standalone="yes"?><vfpdata>';
+loXMLNodes2.Item(i2-1).свойство;
+'</vfpdata>'
...
Рейтинг: 0 / 0
30.10.2012, 13:01
    #38018482
Дима1991
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
Прописал где свойство Text и курсор получается пустой. В чем причина?
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Разбор XML / 25 сообщений из 39, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]