powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как из "сложного" XML получить DataSet?
12 сообщений из 12, страница 1 из 1
Как из "сложного" XML получить DataSet?
    #34357104
AlexanderVM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть XML-файл, сведения о погоде

------------- начало файла
<?xml version="1.0" ?>
- <MMWEATHER>
- <REPORT type="frc3">
- <TOWN index="27612" sname="%CC%EE%F1%EA%E2%E0" latitude="56" longitude="38">
- <FORECAST day="27" month="2" year="2007" hour="15" tod="2" predict="18" weekday="3">
<PHENOMENA cloudiness="3" precipitation="10" rpower="0" spower="0" />
<PRESSURE max="750" min="748" />
<TEMPERATURE max="-7" min="-9" />
<WIND min="5" max="9" direction="4" />
<RELWET max="95" min="90" />
<HEAT min="-14" max="-12" />
</FORECAST>
- <FORECAST day="27" month="2" year="2007" hour="21" tod="3" predict="24" weekday="3">
<PHENOMENA cloudiness="3" precipitation="10" rpower="0" spower="0" />
<PRESSURE max="747" min="745" />
<TEMPERATURE max="-8" min="-10" />
<WIND min="5" max="9" direction="4" />
<RELWET max="97" min="92" />
<HEAT min="-15" max="-13" />
</FORECAST>
- <FORECAST day="28" month="2" year="2007" hour="3" tod="0" predict="30" weekday="4">
<PHENOMENA cloudiness="3" precipitation="10" rpower="0" spower="0" />
<PRESSURE max="746" min="744" />
<TEMPERATURE max="-9" min="-11" />
<WIND min="5" max="9" direction="4" />
<RELWET max="97" min="92" />
<HEAT min="-16" max="-14" />
</FORECAST>
- <FORECAST day="28" month="2" year="2007" hour="9" tod="1" predict="36" weekday="4">
<PHENOMENA cloudiness="3" precipitation="6" rpower="0" spower="0" />
<PRESSURE max="745" min="743" />
<TEMPERATURE max="-9" min="-11" />
<WIND min="5" max="9" direction="4" />
<RELWET max="97" min="92" />
<HEAT min="-16" max="-14" />
</FORECAST>
</TOWN>
</REPORT>
</MMWEATHER>
------------- конец файла

Возможно ли из него получить DataSet? В примерах везде дается обработка "правильного" XML-файла (т.е. состоящего только из элементов). А в данном случае в элементах присутствуют атрибуты!

Обработка таким образом:

oXMLadapter2 = NEWOBJECT('XMLAdapter')
oXMLAdapter2.XMLSchemaLocation='e:\pogoda.xsd'
oXMLAdapter2.LoadXML('e:\pogoda.xml',.F.,.T.)

lcAlias = oXMLAdapter2.Tables.Item(1).Alias
oXMLAdapter2.Tables.Item(1).ToCursor()
SELECT(lcAlias)
BROWSE

на команде LoadXML(...) выдает ошибку:
XML Error: XML Parse error: Invalid at the top level of the document.
...
Рейтинг: 0 / 0
Как из "сложного" XML получить DataSet?
    #34357326
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как из "сложного" XML получить DataSet?
    #34357400
AlexanderVM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо за ссылку, эту статью я уже читал...
в ней описывается обработка "привильного" XML-файла, т.е. используя только элементы
...
<PhoneNumbers>
<HomePhone>808 579-8342</HomePhone>
<WorkPhone>808 579-8342</WorkPhone>
<Fax>808 801-1231</Fax>
<ServiceStarted>1900-01-01T00:00:00.0000000-10:00</ServiceStarted>
</PhoneNumbers>
...

в моем же случае элементы с атрибутами
...
<FORECAST day="27" month="2" year="2007" hour="15" tod="2" predict="18" weekday="3">
<PHENOMENA cloudiness="3" precipitation="10" rpower="0" spower="0" />
<PRESSURE max="750" min="748" />
<TEMPERATURE max="-7" min="-9" />
<WIND min="5" max="9" direction="4" />
<RELWET max="95" min="90" />
<HEAT min="-14" max="-12" />
</FORECAST>
...
...
Рейтинг: 0 / 0
Как из "сложного" XML получить DataSet?
    #34357427
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexanderVMспасибо за ссылку, эту статью я уже читал...
Видимо не очень внимательно. Там дан пример разбора с помощью MSXML2.DomDocument который понимает Attribut-centric формт XML...
...
Рейтинг: 0 / 0
Как из "сложного" XML получить DataSet?
    #34357501
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот пример от Rick
Код: plaintext
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.
CREATE CURSOR Test (Field1 I, Field2 C( 30 ), Field3 DATE, Field4 L)
INSERT INTO Test VALUES ( 1 , "Fabio Vazquez", {^ 2002 - 02 - 16 }, .F.)

* ? CURSORTOXML("test", "c:\test.xml",  1 ,  512 ,  0 , "c:\test.xsd")
lcXML = ""
CURSORTOXML("test", "lcXML", 1 ,  32 , 0 ,"1")

Showxml(lcXML)

* Create the DOMDocument to keep the XML in test.xml that will be validated
LOCAL loXML as "MSXML2.DOMDocument.4.0"
loXML = CREATEOBJECT("MSXML2.DOMDocument.4.0")
loXML.loadxml(lcXML)

IF loXML.parseError.errorCode =  0 
  loNodes = loXML.selectNodes("VFPData/test/field1")
  ?loNodes.item( 0 ).nodeTypedValue     && returns integer  1 
  ?VARTYPE(loNodes.item( 0 ).nodeTypedValue)     && returns integer  1 

  loNodes = loXML.selectNodes("VFPData/test/field2")
  ?loNodes.item( 0 ).nodeTypedValue     && returns string "Fabio Vazquez"

  loNodes = loXML.selectNodes("VFPData/test/field3")
  ?loNodes.item( 0 ).nodeTypedValue     && returns date  2002 - 02 - 16 

  loNodes = loXML.selectNodes("VFPData/test/field4")
  ?loNodes.item( 0 ).nodeTypedValue     && returns boolean false
ELSE
  ?loXML.parseError.reason
ENDIF

loXMLSchema = null
loXML = null
...
Рейтинг: 0 / 0
Как из "сложного" XML получить DataSet?
    #34357907
AlexanderVM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей, это все для "правильных" XML. Вот если бы у меня был xml следующей структуры:
...
<FORECAST>
<day>27</day>
<month>2</month>
<year>2007</year>
<hour>21</hour>
<tod>3</tod>
<predict>24</predict>
<weekday>3</weekday>
</FORECAST>
...
тогда бы, думаю, и проблем бы не было, но у меня то структура следующая:

<FORECAST day="27" month="2" year="2007" hour="15" tod="2" predict="18" weekday="3">
</FORECAST>

так что обработка при помощи MSXML2.DomDocument и XMLAdapter у меня не получается...
ничего не подгружается через комманду
...
loXML.loadxml(lcXML)
...

может есть какой-нибудь другой способ обработки таких "неправильных" xml?
...
Рейтинг: 0 / 0
Как из "сложного" XML получить DataSet?
    #34357989
AlexanderVMСергей, это все для "правильных" XML. Вот если бы у меня был xml следующей структуры:
...
<FORECAST>
<day>27</day>
<month>2</month>
<year>2007</year>
<hour>21</hour>
<tod>3</tod>
<predict>24</predict>
<weekday>3</weekday>
</FORECAST>
...
тогда бы, думаю, и проблем бы не было, но у меня то структура следующая:

<FORECAST day="27" month="2" year="2007" hour="15" tod="2" predict="18" weekday="3">
</FORECAST>

так что обработка при помощи MSXML2.DomDocument и XMLAdapter у меня не получается...
ничего не подгружается через комманду
...
loXML.loadxml(lcXML)
...

может есть какой-нибудь другой способ обработки таких "неправильных" xml?

То, что Вы указали и в первом, и во втором случае - абсолютно правильные XML.
Только в первом случае XML реализован через "дерево" подчиненных узлов (Nodes), а во втором случае - через атрибуты одного узла.
Поэтому надо использовать:
MSDN Help
getAttribute Method
[This is preliminary documentation and subject to change.]
Gets the value of the named attribute.

Syntax

objValue = oXMLDOMElement.getAttribute(name)

Parameters

name

String specifying the name of the attribute to return.

Returns

Variant. Returns a string that contains the attribute value, or returns the empty string if the named attribute does not have a specified or default value.

Remarks

Another way to retrieve attributes is to use the XMLDOMNamedNodeMap object's getNamedItem method.

Applies To

XMLDOMElement
...
Рейтинг: 0 / 0
Как из "сложного" XML получить DataSet?
    #34358205
AlexanderVM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но, по-моему, в FoxPro нет возможности создать объект XMLDOMElement. Или я не прав?

При загрузке xml-файла любым из 3-х способов
...
loXML = CREATEOBJECT("XMLAdapter")
loXML.LoadXML(lcXML)
...
или
...
loXML = CREATEOBJECT("MSXML2.DomDocument")
loXML.LoadXMl(lcXML)
...
или
...
loXML = CREATEOBJECT("MSXML2.DOMDocument.4.0")
loXML.loadxml(lcXML)
...

в loXML ничего не попадает, чтобы начать обработку... и соответственно loXML .DocumentElement ничего не возвращает. Следовательно, нужен, наверное, какой-то другой способ загрузки xml-файла в объект.

Если есть какие-нибудь предположения, можно предоставить в виде небольшого примера, оригинал xml-файла есть в начале темы... Но, только чтобы это работало в FoxPro.
...
Рейтинг: 0 / 0
Как из "сложного" XML получить DataSet?
    #34358417
AlexanderVMНо, по-моему, в FoxPro нет возможности создать объект XMLDOMElement. Или я не прав?

При загрузке xml-файла любым из 3-х способов
...
loXML = CREATEOBJECT("XMLAdapter")
loXML.LoadXML(lcXML)
...
или
...
loXML = CREATEOBJECT("MSXML2.DomDocument")
loXML.LoadXMl(lcXML)
...
или
...
loXML = CREATEOBJECT("MSXML2.DOMDocument.4.0")
loXML.loadxml(lcXML)
...

в loXML ничего не попадает, чтобы начать обработку... и соответственно loXML .DocumentElement ничего не возвращает. Следовательно, нужен, наверное, какой-то другой способ загрузки xml-файла в объект.

Если есть какие-нибудь предположения, можно предоставить в виде небольшого примера, оригинал xml-файла есть в начале темы... Но, только чтобы это работало в FoxPro.
Ну и лентяй Вы, батенька...
Вот держите...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
* Create the DOMDocument to keep the XML in test.xml that will be validated
LOCAL loXML
loXML = CREATEOBJECT("MSXML.DOMDocument")
loXML.load("your.xml")


IF loXML.parseError.errorCode =  0 
  loXMLNodes=loXML.getElementsByTagName("MMWEATHER/REPORT/TOWN/FORECAST")

  For i =  0  TO (loXMLNodes.length - 1 )
    loNodes = loXMLNodes.nextNode
    ?loNodes.getAttribute("day")
    ?loNodes.getAttribute("month")
    ?loNodes.getAttribute("year")
 Next
ELSE
  ?loXML.parseError.reason
ENDIF

loXML = null
Остальное сами допишете...
P.S. У меня VFP 6.0
...
Рейтинг: 0 / 0
Как из "сложного" XML получить DataSet?
    #34358645
AlexanderVM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав, большое спасибо за пример!!!

Не в лентяйстве дело, а скорее всего в непонимании еще обработки XML-файлов. Только начинаю этим заниматься.... Спасибо еще раз!!!
...
Рейтинг: 0 / 0
Как из "сложного" XML получить DataSet?
    #34359081
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще полезно изучить что такое xsl-трансформация. Тогда все станет очень просто.
...
Рейтинг: 0 / 0
Как из "сложного" XML получить DataSet?
    #35070558
bodrox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А обратный процесс? Задание атрибутов узлам и выгрузка?
--------------
Новичок в VFOX
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как из "сложного" XML получить DataSet?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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