Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как из "сложного" XML получить DataSet? / 12 сообщений из 12, страница 1 из 1
27.02.2007, 12:11
    #34357104
AlexanderVM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из "сложного" XML получить DataSet?
Есть 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
27.02.2007, 12:54
    #34357326
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из "сложного" XML получить DataSet?
...
Рейтинг: 0 / 0
27.02.2007, 13:11
    #34357400
AlexanderVM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из "сложного" XML получить DataSet?
спасибо за ссылку, эту статью я уже читал...
в ней описывается обработка "привильного" 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
27.02.2007, 13:18
    #34357427
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из "сложного" XML получить DataSet?
AlexanderVMспасибо за ссылку, эту статью я уже читал...
Видимо не очень внимательно. Там дан пример разбора с помощью MSXML2.DomDocument который понимает Attribut-centric формт XML...
...
Рейтинг: 0 / 0
27.02.2007, 13:32
    #34357501
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из "сложного" XML получить DataSet?
Вот пример от 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
27.02.2007, 14:59
    #34357907
AlexanderVM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из "сложного" XML получить DataSet?
Сергей, это все для "правильных" 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
27.02.2007, 15:21
    #34357989
Как из "сложного" XML получить DataSet?
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
27.02.2007, 16:19
    #34358205
AlexanderVM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из "сложного" XML получить DataSet?
Но, по-моему, в 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
27.02.2007, 17:11
    #34358417
Как из "сложного" XML получить DataSet?
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
27.02.2007, 18:12
    #34358645
AlexanderVM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из "сложного" XML получить DataSet?
Станислав, большое спасибо за пример!!!

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


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