powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Разбор XML
25 сообщений из 39, страница 1 из 2
Разбор XML
    #37600237
alm2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть 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
Разбор XML
    #37600290
Grin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Разбор XML
    #37601163
alm2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ответ

Утояняю - необх учесть 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
Разбор XML
    #37601506
Grin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да Вы батенька лентяй ....

у меня нету опыта работы с 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
Разбор XML
    #37608664
Koryuu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 alm2
Учитывая тэг USL и тот факт, что вы из Самары.... вы не пакет со счетом ОМС пытаетесь разобрать?
Если так, то можно воспользоваться ковертером, который МИАЦ написал. Корявый, долго работает, но если его рефокснуть, то внутри есть кусок кода, который позволяет полностью разобрать XML-ку
...
Рейтинг: 0 / 0
Разбор XML
    #37608735
DV_RUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alm2,

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

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


<zl_list>

<zap>

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

</zap>

</zl_list>

как создать курсор с данные из тега Pacient. Т.е. содержащая поля FAM,IM,OT. с этим не могу разобраться
...
Рейтинг: 0 / 0
Разбор XML
    #38018140
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима1991, добраться до ноды <pacient>, вытащить текст, скормить полученный текст xmltocursor-у. В теге "пациент" вложенных тегов нет, так что вот тут xmltocursor как раз подойдёт.
...
Рейтинг: 0 / 0
Разбор XML
    #38018148
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, в том то и дело что я не знаю как туда добраться. :)
...
Рейтинг: 0 / 0
Разбор XML
    #38018154
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Разбор XML
    #38018206
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, нет нет, он в поле id_usl выводит все содержимое тега pacient. А как сделать чтобы каждый подтег выводился в отдельном столбике. fam отдельно, im отдельно и т.д.
...
Рейтинг: 0 / 0
Разбор XML
    #38018213
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если вам не сложно подскажите как написать чтобы вот содержимое тега pacient выводилось в отдельных столбиках. я его разбирать буду потом и по аналогии делать для других тегов.
...
Рейтинг: 0 / 0
Разбор XML
    #38018334
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как разбирать отдельные теги внутри тега pacient? а то все теги в один столбик копируются если ваш код применять
...
Рейтинг: 0 / 0
Разбор XML
    #38018374
Grin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима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
Разбор XML
    #38018406
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Разбор XML
    #38018414
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мне нужно в курсор вывести в отдельных столбиках fam,im,ot и еще другие поля.. вот это мне непонятно самое важное
...
Рейтинг: 0 / 0
Разбор XML
    #38018436
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Grin, а вы не можете написать код, который в курсор выведет поле fam и im допустим. в отдельных столбцах как таблица. я потом хочу разобрать этот код и остальное сам доделать.

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

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

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
Разбор XML
    #38018455
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима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
Разбор XML
    #38018470
Дима1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, что делается в этой строке и что за свойство должно быть вы не можете сказать? Если бы я имел опыт работы с xml то было легче наверное, но я первый раз столкнулся с этим. Тем более я новичек в фоксе, знаю не много

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


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