Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Помогите разобрать xml через dom  [new]
НадеждаМ
Member

Откуда:
Сообщений: 812
Нужно разобрать xml файл и загрузить его данные в dbf

Пока остановилась на этих 4 строчках:

loXML = CREATEOBJECT("MSXML.DOMDocument")
loXML.validateOnParse = .t.
loXML.async = .f.
loXML.loadxml(filetostr("C:\01.08.20112.xml"))

Я понимаю что этого кода не достаточно, чтобы получить желаемый результат, но продолжу искать пути решения завтра.

Как получить из файла даные дл загрузки в dbf? Подтолкните пожалуйста в нужном направлении.
26 окт 11, 17:21    [11504696]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобрать xml через dom  [new]
IgorNG
Member

Откуда: Москва
Сообщений: 956
НадеждаМ,

Преобразует XML текст в курсор или таблицу Visual FoxPro.


XMLTOCURSOR(eExpression | cXMLFile [, cCursorName [, nFlags ]])



Параметры
eExpression
Определяет XML текст или выражение, которое оценивается в действительные XML данные. Параметр eExpression может представлять собой переменную памяти Visual FoxPro, содержание мемо поля, возврат из HTTP запроса, результат, возвращенный из вызова метода SOAP, XML из XMLDOM поток ADO.

Замечание
XMLTOCURSOR() сгенерирует ошибку, если eExpression не найдено или если eExpression не разбирается в действительный XML.


cXMLFile
Определяет имя, и, необязательно, путь физического XML файла, который размещен на вашем локальном компьютере или в сети.

Если вы не указали для файла путь, Visual FoxPro будет искать XML файл внутри каталогов Visual FoxPro.

cCursorName
Определяет имя курсора для хранения результата разбора XML файла или выражения и создает курсор в текущей рабочей области.

Если курсор с указанным именем уже существует или открыт, Visual FoxPro закрывает курсор и создает его заново в неиспользуемой рабочей области. Если вы опустите параметр cCursorName или пошлете для него пустую строку (""), Visual FoxPro создаст курсор с именем "XMLRESULT" для возврата результата разбора XML файла или выражения.

Если cCursorName содержит данные, а параметр nFlags установлен в значение 8192, Visual FoxPro добавить импортируемые из XML файла данные в существующий курсор или таблицу. Для этого случая таблица или курсор должны быть открыты или использоваться. Если cCursorName представляет собой пустую строку (""), Visual FoxPro импортирует XML в таблицу или курсор, которые открыты в текущей рабочей области.

nFlags
Определяет как будет обрабатываться XMLSource eExpression функцией XMLTOCURSOR( ). В приведенной ниже таблице описаны значения для параметра nFlags.


nFlags Бит Описание
0
0000
(По умолчанию) Рассматривает первый параметр, как строку, содержащую XML данные.

4
0100
Сохраняет "белые" пространства в данных и переписывает аттрибут xml:space XML данных.

512
01000000000
Определяет, что первый параметр, eExpression или cXMLFile, представляет собой строку, содержащую имя файла с XML данными и путь к нему.

1024
10000000000
NOCPTRANS – Создает в результирующей курсоре поля Character и Memo с опцией NOCPTRANS и вставляет текст или XML значения, содержащиеся в исходных элементах в поля Character или Memo без осуществления трансляции кодовых страниц, на основе "байт за байтом".

При использовании флага 1024, XMLTOCURSOR( ) возвращает строку с хвостовыми пробелами, которые равны по длине реальной строке, то есть строку удвоенной длины.

2048
100000000000
Используется в случае, когда импортируемая схема представляет собой схему "XML schema definition" (XSD), содержащую ограничения, или фасеты, totalDigits="19" и fractionDigits="4".

В этом случае, значения типов данных XSD, имеющих такие фасеты, размечаются в тип данных Visual FoxPro Currency в результирующем курсоре.

4096
1000000000000
Запрещает перекодировку по базе base64.

В Visual FoxPro, кодировка base64 внедрена только для кодировки бинарных данных.

8192
1100000000
Определяет, что параметр cCursorName представляет собой имя или псевдоимя (alias) существующей таблицы или курсора, что приведет импорт данных из указанного источника XML данных в существующую таблицу или заранее определенный курсор.

Если таблица или курсор с именем cCursorName содержит данные, то импортируемые из XML источника данные будут добавлены к существующим данным. Если cCursorName представляет собой пустую строку (""), данные из XML источника импортируются в таблицу или курсор, открытые в текущей рабочей области.

Установка флага nFlags в значение 8192 может быть полезна в случае, когда схема XML недоступна или не может быть использована.

(Кроме того, установка флага в это значение чрезвычайно полезна при сборке информации, поступающей в виде XML данных из разных источников, например агентов компаний или подразделений, в одну таблицу. При этом отпадает необходимость использования дополнительного кода, содержащего, к примеру, APPEND FROM, что значительно повышает производительность приложения. Примечания переводчика)

32768
0x8000
Указывает, что должна быть использована кодовая страница.

65536
0x10000
Размечает поля Char XML в родные поля Varchar Visual FoxPro. Если это значение не установлено во флаге, поля XML Char размечаются в поля Character Visual FoxPro.

131072
0x20000
Размечает поля XML base64Binary в родные поля Fox Varbinary, если их длина меньше, чем 255 байт или, в противном случае, в поля Blob. Если это значение не установлено во флаге, поля XML base64Binary размечаются в Memo поля Visual FoxPro.


При использовании флага 8192 имейте ввиду приведенное ниже:

Вы должны убедиться, что схема таблицы отвечает исходным элементам XML соответствующим образом. Visual FoxPro "навязывает" тип данных, существующих в cCursorName так как это описано в приведенной ниже таблице соответствия типов данных но не делает допущений о типах данных. Попытка импортировать несовместимые данные приведет к генерации соответствующего сообщения.

Если XML содержит схему или ссылается на нее (в случае внешней схемы), а типы данных в схеме конфликтуют с типами данных курсора или таблицы, то будут использованы типы данных курсора или таблицы.

Имена элементов в XML файле размечаются в имена колонок в cCursorName. В дополнение к этому, Visual FoxPro импортирует данные только из тех элементов, имена которых соответствуют именам колонок курсора, указанного в cCusorName.

Курсор или таблица могут иметь больше колонок, чем их число, имеющееся в XML файле, но они должны иметь по крайней мере одну колонку с соответствием имен, как в курсоре, так и в XML файле. Иными словами, таблица или курсор могут иметь дополнительные колонки, которые не соответствуют элементам в XML файле.

Если таблица содержит поля с автоувеличением, функция XMLTOCURSOR() не сработает в случае, если AUTOINCERROR установлен в ON. Установка AUTOINCERROR в OFF или отключение автоувеличения в целевой таблице с помощью функции CURSORSETPROP( ) позволит выполнение функции XMLTOCURSOR( ). Поле или поля с автоувеличением целевой таблицы увеличивают свои значения в соответствии с определенным при их создании значением, и эти значения в исходной таблице не копируются.

В приведенной ниже таблице описываются ограничения соответствия типов данных при установке флага nFlags в значение 8192.


Тип данных Visual FoxPro Поведение
Character, Character (Binary), Memo, Memo (Binary)
Акцептирует любые данные, но обрезает любые данные в случае, если их длина превышает длину колонки с типом Character.

Currency
Акцептирует численные данные внутри акцептируемого диапазона для данных типаCurrency но обрезает числа, выходящие за пределы акцептируемого диапазона.

Date
Акцептирует формат даты XML и значения dateTime.

Visual FoxPro конвертирует форматы даты XML и dateTime в соответствующие форматы даты Visual FoxPro. Visual FoxPro сохраняет из значений XML даты или dateTime только порцию даты, то есть Месяц/День/Год.

DateTime
Акцептирует формат даты XML и значения dateTime.

Visual FoxPro конвертирует форматы даты XML и dateTime в соответствующие форматы даты Visual FoxPro и сбрасывает точность данных (миллисекунды), выходящие за пределы поддерживаемого Visual FoxPro формата.

Double
Акцептирует численные данные внутри акцептируемого диапазона данных типа Double, но обрезает числа, выходящие за пределы этого диапазона.

Integer
Акцептирует целочисленные данные внутри акцептируемого диапазона данных типа Integer, но обрезает числа, выходящие за пределы этого диапазона.

Logical
Акцептирует значения True, .T., 1, False, .F. и 0.

Numeric, Float
Акцептирует численные данные с десятичными знаками или без них, но обрезает числа выходящие за пределы акцептируемого диапазона для этих типов в соответствии с правилами Visual FoxPro или замещает их индикатором переполнения ("*************").


Возвращаемое значение
Численный тип данных. XMLTOCURSOR( ) возвращает число созданных записей.

Примечание
Вы можете использовать XMLTOCURSOR( ) с OLE DB Provider для Visual FoxPro. Однако, свойство VFPXMLProgID системной переменной _VFP не поддерживается, так как системная переменная _VFP не поддерживается в OLE DB Provider.

Замечание
Для использования Visual FoxPro OLE DB Provider с функцией XMLTOCURSOR( ), вы должны установить MSXML 3.0 на компьютер с OLE DB Provider.


XMLTOCURSOR() генерирует ошибку синтаксиа для записей с длиной большей, чем приблизительно 160 колонок. Точное число колонок, которое может вызвать такую ошибку зависит от длины имен колонок.

XMLTOCURSOR( ) does not use the Varchar type when creating a cursor from an XML document. However, XMLTOCURSOR( ) supports appending data into an existing cursor with Varchar fields.

При вызове функции XMLTOCURSOR( ) в режиме добавления записей, Visual FoxPro добавляет пустую строку, если имена элементов XML не соответствует любым именам таблицы или курсора.

XMLTOCURSOR( ) конвертирует тип данных Decimal в тип данных Numeric 20,19 (длина, точность). В версиях до Visual FoxPro 8.0, тип данных Decimal размечался в тип данных Numeric 8,0.

Условия численного переполнения XMLTOCURSOR( ) импортирует XML данные, содержащие условия численного переполнения Visual FoxPro, например, "*******", вместо численных (numeric) или целочисленных (integer) значений. Если совместно с XML файлов предоставляется схема, то Visual FoxPro создает корректные типы данных в результирующем наборе, но заменяет переполнение с символом asterisk (*) в значения 0.0 или 0. Поэтому XML парсер, используемый функцией XMLTOCURSOR( ) не вызывает ощибки вследствие того, что символьные значения хранятся в элементе с типом данных decimal.

Для получения более подробной информации о конвертировании XML в данные Visual FoxPro смотрите описание Преобразование между данными XML и Visual FoxPro.
26 окт 11, 17:40    [11504824]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобрать xml через dom  [new]
НадеждаМ
Member

Откуда:
Сообщений: 812
IgorNG,

Про XMLTOCURSOR я могу и в справке прочитать. Но насколько я понимаю, XMLTOCURSOR работает только с файлами созданными CURSORTOXML?
27 окт 11, 08:01    [11506425]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобрать xml через dom  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
НадеждаМ
Про XMLTOCURSOR я могу и в справке прочитать. Но насколько я понимаю, XMLTOCURSOR работает только с файлами созданными CURSORTOXML?

Ему без разницы, чем он создан. Тут важно, чтобы файл XML имел определенную структуру, которую функция XMLTOCURSOR() сможет "понять". Пример возможных схем приведен в справке

Преобразование между XML и данными Visual FoxPro (Converting Between XML and Visual FoxPro Data)

В принципе, XMLDOM - это просто удобный парсер для чтения содержимого XML-файла по одному значению за раз. Соответственно, логика разбора будет примерно такая: прочитать одно значение - записать это значение в поле таблицы.

А вот, что именно понимать под "значением" как раз и зависит от структуры XML-файла. Тут возможны варианты.
27 окт 11, 11:15    [11507324]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобрать xml через dom  [new]
НадеждаМ
Member

Откуда:
Сообщений: 812
ВладимирМ,

В принципе логика разбора ясна, но вот как это реализовать пока не очень.
27 окт 11, 11:19    [11507370]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобрать xml через dom  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Сделайте поиск по данному форуму по ключевому слову "DOMDocument". Найдете примеры. Ну, вот один из первых

LoadXML
27 окт 11, 11:43    [11507573]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить