Хомоненко А.Д., Цыганков В.М., Мальцев М.Г. - Базы данных. Учебник для высших учебных заведений (6-е изд.) - 2009
.pdf1 7. Публикация БД с использованием XML |
663 |
всего преобразовать в XML-документ HTML-страницы. При этом нужно обеспечить дополнительные ограничения, накладываемые со стороны XML. Можно получить также XML-доку менты путем преобразования следующих типов документов: файлов PDF (Portable Document Format), используемых для представления в Интернете текстовых и числовых данных большого объема; документов табличных процессоров, таких как Excel; файлов баз данных, например СУБД Access; файлов документов текстовых процессоров, таких как Word.
В общем случае преобразование в ХМ L-документ из файла документ другого формата может представлять достаточно трудоемкую задачу. Для решения задачи такого преобразования могут быть задействованы разнообразные инструментальные средства, такие как редакторы XML, синтаксические обозреватели и процессоры, серверные продукты, обозреватели Web, инструментальные средства проверки ссылок и синтаксиса.
Обработка XML-документов обычно включает в себя синтаксический анализ и собственно обработку, например, для отображения документа обозревателем или для извлечения данных из документа и помещения их базу данных. Синтаксический анализ XML-документов может выполняться с помощью синтаксических анализаторов или с помощью встроенных средств современных обозревателей Web. В частности, в составе обозревателя Internet Explorer 5.0 имеется встроенное средство синтаксического анализа, называемое MSXML.
С помощью синтаксических анализаторов выполняется считывание XMLдокумента и построение соответствующего этому документу иерархического дерева разбора данных. С их помощью можно создавать также соответствующее представление XML-документа. Для синтаксического анализа XML-до- кументов используются два основных подхода. Первый подход основан на использовании объектной модели документа DOM (Document Object Model), позволяющей отображать любые объекты в XML-документе. Второй подход представляет собой простой интерфейс прикладного программирования SAX (Simple API for XML).
При синтаксическом анализе с помощью объектной модели DOM выполняется считывание всего XML-документа, создание иерархического дерева разбора и возврат данных из этого дерева. Этот способ не позволяет пользователю вмешиваться в процесс анализа и в наибольшей степени подходит для выполнения синтаксического анализа документов не очень большого объема. Отметим, что описанный способ поддерживается с помощью анализатора MSXML в составе Internet Explorer 5.0.
Анализ XML-документа с помощью объектной модели DOM требует создания экземпляра анализатора. Для этого можно использовать объект ActiveX, представляющий собой документ. После этого можно выполнять
664 |
Часть 4. Публикация баз данных в Интернете |
доступ к данным документа с помощью свойств и методов созданного объекта. При этом созданный объект-документ предварительно нужно связать с анализируемым Х М L-документом по его URL с помощью метода l o a d оъекта. После нужно указать корневой элемент документа и можно выполнять перемещение по структуре документа. Описанные действия могут быть реализованы с помощью следующих строк кода:
var vxmldoc = new ActiveXObject ("microsoft.xmldom"); vxmldoc.load("MyXMLDoc.xml");
var vroot = vxmldoc.documentNode;
Здесь в качестве аргумента метода A c t i v e X O b j e c t может быть задана также строка "msxml". Для доступа к дочерним элементам объекта-документа могут использоваться его свойства c h i l d r e n или c h i l d N o d e s .
Второй подход SAX обеспечивает интерфейс пользователя с синтаксическим анализатором. При этом выполняется интерактивный разбор не всего ХМ L-документа в целом, а представляющей в настоящее время наибольший интерес части. При этом пользователь может перемещаться по документу и информировать синтаксический анализатор об определенных событиях, например, выявлении начала следующего элемента. Этот подход позволяет выполнять синтаксический анализ больших ХМ L-документов. Упоминавшийся нами анализатор MSXML в составе Internet Explorer 5.0 не поддерживает подход SAX, но в дополнение к нему поставляются разработки других фирм, позволяющие его использование.
17.3. Сценарий для отображения XML-документа
Как отмечалось, современные обозреватели, например, Internet Explorer версии 5.0, позволяют проверять правильность и просматривать XML-до- кументы. При просмотре в обозревателях можно управлять степенью детальности отображения их иерархической структуры. Например, пусть имеется XML-документ, размещенный в файле myNewl.xml и содержащий следующий код:
<? x m l v e r s i o n = " 1 . 0 " ? >
<n o t e b o o k >
< t i t l e > P u b l i s h e r s b o o k s < / t i t l e >
<p u b l i s h e r >
<n a m e > B H V - S P b < / n a m e >
< a d d r e s s > B o b r u i s k a i a S t r e e t , 4 < / a d d r e s s > < t e l > ( 8 1 2 ) 5 4 1 - 8 5 - 5 1 < / t e l >
< E m a i l U r l > r o o t @ b h v . r u , w w w . b h v . r u < / E m a i l U r l > < / p u b l i s h e r >
1 7. Публикация БД с использованием XML |
665 |
<b o o k s - l i s t >
<b o o k I D = " 1 " >
<t i t l e > S Q L - s e r v e r < / t i t l e >
<d a t e > 2 0 . 0 1 . 2 0 0 1 < / d a t e >
< s e r i e s > l n t h e o r i g i n a l < / s e r i e s >
< a b o u t > A d m i n i s t r a t i o n a n d u s e < / a b o u t > < a u t h o r s - l i s t >
< a u t h o r I D = " 1 " >
<f i r s t n a m e > E u g e n e < / f i r s t n a m e >
<l a s t n a m e > M a m a e v < / l a s t n a m e >
</ a u t h o r >
</ a u t h o r s - l i s t >
</ b o o k >
<b o o k I D = " 2 " >
< t i t l e > D a t a b a s e p u b l i c a t i o n in t h e I n t e r n e t < / t i t l e > < d a t e > 2 1 . 0 3 . 2 0 0 1 < / d a t e >
< s e r i e s > M a s t e r < / s e r i e s >
< a b o u t > T e c h n o l o g i e s o f t h e p u b l i c a t i o n in t h e l n t e r n e t < / a b o u t > < a u t h o r s - l i s t >
< a u t h o r I D = " 1 " >
<f i r s t n a m e > E u g e n e < / f i r s t n a m e >
<l a s t n a m e > M e s c h e r i a k o v < / l a s t n a m e >
</ a u t h o r >
< a u t h o r I D = " 2 " >
<f i r s t n a m e > A n a t o l y < / f i r s t n a m e >
<l a s t n a m e > K h o m o n e n k o < / l a s t n a m e >
</ a u t h o r >
</ a u t h o r s - l i s t >
</ b o o k >
</ b o o k s - l i s t >
</ n o t e b o o k >
Как следует из текста, XML-доку мент служит для размещения информации о книгах издательств. В окне обозревателя приведенный документ может быть представлен в виде, показанном на рис. 17.1.
В ряде случаев может потребоваться отображение отдельных (или всех) компонентов XML-доку мента с заданием требуемого их расположения в окне обозревателя. Для этого можно написать клиентскую программу в виде Javaапплета или сценария JScript.
Рассмотрим решение задачи отображения в требуемом виде приведенного выше ХМ L-документа в окне обозревателя с помощью сценария JScript и объектной модели DOM.
666 |
|
Часть 4. Публикация баз данных в Интернете |
• ' 3 О Л П у б л и к а ц и я Б Д в И н т е р н е т \ Г л а в а 8 И с п о л ь з о в а н и е Х т 1 \ М е щ . . . Д И Е З |
||
Файл Правка Вид |
Избранное |
Сервис ^правка |
<?хпп1 version="1.0" |
?> |
|
<notebook> |
|
|
<title > P u b l i s h e r s |
b o o k s < / t i t l e |
> |
-<publisher>
<n a m e > B H V - S P b < / n a m e >
< a d d r e s s > B o b r u i s k a i a S t r e e t , 4</address> <tel > ( 8 1 2 ) 5 4 1 - 8 5 - 5 1 </tel>
< E m a i l U r l > i * o o t @ b h v . r u , w w w . b h v . r u < / E n n a i l U r l > </publisher>
- <books-list>
- <book I D = " l " >
-c title > S Q L - s e r v e r < / t i t l e > < d a t e > 2 0 . 0 1 . 2 0 0 1 < / d a t e >
< s e r i e s > I n t h e o r i g i n a l < / s e r i e s >
< a b o u t > A d m i n i s t r a t i o n a n d u s e < / a b o u t > + <authors-list>
</book>
+ <book I D = " 2 " > </books-list>
</notebook>
Рис. 17.1. Вид XML-документа notebook.xml в окне обозревателя
Документ HTML с решающим нашу задачу сценарием JScript содержит следующий код:
< H T M L > < h e a d > < t i t l e > < / t i t l e > < s c r i p t l a n g u a g e = " j a v a s c r i p t " >
v a r x m l d o c = n e w A c t i v e X O b j e c t ( " m s x m l " ) ; v a r x m l s r c = " m y N e w l . x m l " ;
f u n c t i o n v i e w T i t l e ( e l e m ) {
/ / О т о б р а ж е н и е з а г о л о в к а д о к у м е н т а , о п р е д е л я е м о г о э л е м е н т о м < t i t l e > w i n d o w . d o c u m e n t . w r i t e l n ( ' < c e n t e r > < t a b l e w i d t h = " 1 0 0 % "
b o r d e r - O x t r x t d w i d t h = " 1 0 0 % " a l i g n = " c e n t e r " x b x f o n t
c o l o r = " b l a c k " > ' + e l e m . t e x t + ' < / f o n t x / b x / t d x / t r > < / t a b l e > < / c e n t e r > < b r > ' ) ; }
f u n c t i o n v i e w P u b l i s h e r L i s t ( e l e m )
{ / / О т о б р а ж е н и е с о д е р ж и м о г о д о ч е р н и х э л е м е н т о в < P u b l i s h e r > v a r c u r _ i t e m = e l e m . c h i l d r e n . i t e m ( " n a m e " ) ;
w i n d o w . d o c u m e n t . w r i t e l n ( ' < t r x t d a l i g n = " c e n t e r " c o l s p a n = " 2 "
668 Часть 4. Публикация баз данных в Интернете
{ v a r c u r _ b o o k = e l e m . c h i l d r e n . i t e m ( " b o o k " , i ) ;
w i n d o w . d o c u m e n t . w r i t e l n ( , < t r > < t d c o l s p a n = 2 w i d t h = " 6 0 % " > < / t d > < / t r > ' ) ; if(cur_book.children!=null)
{v a r c u r _ i t e m = c u r _ b o o k . c h i l d r e n . i t e m ( " t i t l e " ) ;
if ( c u r _ i t e m ! = n u l l )
{ w i n d o w . d o c u m e n t . w r i t e l n ( ' < t r > < t d a l i g n = " l e f t " c o l s p a n = " 2 " x b x f o n t
c o l o r = " b l a c k ' , > ' + c u r J t e m . t e x t + ' < / f o n t x / b x / t d x / t r > ' ) ;
}
var c u r _ i t e m = c u r _ b o o k . c h i l d r e n . i t e m ( " s e r i e s " ) ; i f ( c u r _ i t e m ! = n u l l )
{ w i n d o w . d o c u m e n t . w r i t e l n ( , < t r > < t d > < f o n t с о 1 о г = " д г е е п " > С е р и я < / f o n t x / t d x t d a l i g n = " r i g h t " x b x f o n t
c o l o r = ' ' g r a y " > ' + c u r J t e m . t e x t + ' < / f o n t x / b x / t d x / t r > ' ) ;
}
v a r c u r _ i t e m = c u r _ b o o k . c h i l d r e n . i t e m ( " a u t h o r s - l i s t " ) ; i f ( c u r _ i t e m ! = n u l l )
{ w i n d o w . d o c u m e n t . w r i t e l n ( ' < t r x t d > < f o n t с о 1 о г = " д г е е п " > А в т о р ы < / f o n t x / t d x t d a l i g n = " r i g h t " x b x f o n t
c o l o r = " g r a y " > ' + c u r _ i t e m . t e x t + ' < / f o n t > < / b > < / t d > < / t r > , ) ;
}
w i n d o w . d o c u m e n t . w r i t e l n ( ' < t r > < t d c o l s p a n = 2 w i d t h = " 1 0 0 % " > < / t d x / t r > ' ) ;
} } } } }
f u n c t i o n v i e w E r r o r Q
{ w i n d o w . d o c u m e n t . w r i t e l n ( ' < c e n t e r > < h r > E r r o r w a s d e t e c t e d ' ) ; }
f u n c t i o n p a r s e ( r o o t ) |
|
{ i f ( r o o t = = n u l l ) return; var i=0; var |
e l e m ; |
i{f ( r o o t . c h i l d r e n ! = n u l l ) |
|
/ / ЕСЛИ в л о ж е н н ы е э л е м е н т ы не |
о п р е д е л е н ы , |
/ / т о с в о й с т в о c h i l d r e n б у д е т |
|
/ / у с т а н о в л е н о в null |
|
w i n d o w . d o c u m e n t . w r i t e l n ( ' < c e n t e r > < t a b l e w i d t h = " 8 0 % " b o r d e r - 0 > < t r x t d > ' ) ; / / П е р е б о р д о ч е р н и х э л е м е н т о в f o r ( i = 0 ; i < r o o t . c h i l d r e n . l e n g t h ; i + + )
{ e l e m = r o o t . c h i l d r e n . i t e m ( i ) ;
/ / Р а з б о р п о д э л е м е н т о в < t i t l e >
i f ( r o o t . c h i l d r e n . i t e m ( i ) . t a g N a m e = = " T I T L E " ) { v i e w T i t l e ( e l e m ) ;
}
/ / Р а з б о р п о д э л е м е н т о в < p u b l i s h e r >
i f ( e l e r r i . t a g N a m e = = " P U B L I S H E R " ) { v i e w P u b l i s h e r L i s t ( e l e m ) ;
}
/ / Р а з б о р п о д э л е м е н т о в < b o o k s - l i s t >
1 7. Публикация БД с использованием XML |
669 |
i f ( e l e m . t a g N a m e = = " B O O K S - L I S T " ) { v i e w B o o k s L i s t ( e l e m ) ;
}
}
w i n d o w . d o c u m e n t . w r i t e l n ( ' < / t d > < / t r > < / t a b l e > ' ) ;
} }
f u n c t i o n v i e w D o c u m e n t ( )
{ / / З а г р у з к а X M L д о к у м е н т а
w i n d o w . d o c u m e n t . w r i t e l n ( ' < b o d y b g c o l o r = " w h i t e " > ' ) ; p a r s e ( x m l d o c . r o o t ) ;
/ / Н а ч а л о р а з б о р а д о к у м е н т а
w i n d o w . d o c u m e n t . w r i t e l n ^ / b o d y V ) ;
}
/ / < s c r i p t l a n g u a g e = " j a v a s c r i p t " > x m l d o c . U R L = x m l s r c ;
v i e w D o c u m e n t ( ) ;
// - - >
</ s c r i p t >
</ h e a d >
Приведенный сценарий выполняет разбор содержимого XML-документа из файла notebook.xml и задает его отображение в окне обозревателя Internet Explorer 5.0, как показано на рис. 17.2.
Таким образом, в рассмотренном примере состав и тип извлекаемых для отображения данных определяются документом XML, а состав отображаемых данных и порядок их расположения в окне обозревателя определяются с помощью сценария JScript. Определенным недостатком рассмотренного решения является ориентация сценария JScript строго на обозреватель Internet Explorer.
17.4. Формирование XML-документа на основе базы данных
Одной из наиболее важных прикладных задач, связанных с публикацией баз данных в Интернете с помощью XML, является формирование XML-до- кументов на основе данных из баз данных. Одним из вариантов решения названной задачи на стороне клиента является использование Java-апплета.
НТМ L-документ, содержащий вызов Java-апплета, формирующего XMLдокумент, содержит следующий код:
<H T M L >
<H E A D >
1 7. Публикация БД с использованием XML |
671 |
A L I G N = m i d d l e |
|
>
</ A P P L E T >
</ B O D Y >
</ H T M L >
Апплет, выполняющий формирование XML-документа на основе данных из базы данных Authors, входящей в состав учебника по ASP-страницам в комплекте Windows 2000 Server, содержит следующий код:
p a c k a g e A p p l e t X M L ;
i m p o r t j a v a . a w t . * ;
i m p o r t j a v a . a w t . e v e n t . * ; i m p o r t j a v a . a p p l e t . * ;
i m p o r t j a v a x . s w i n g . * ;
i m p o r t j a v a . a p p l e t . A p p l e t ; i m p o r t j a v a . a w t . G r a p h i c s ; i m p o r t j a v a . u t i l . V e c t o r ;
i m p o r t j a v a . s q l . * ; i m p o r t j a v a . i o . * ;
p u b l i c c l a s s A p p l e t l e x t e n d s J A p p l e t i m p l e m e n t s R u n n a b l e { p r i v a t e T h r e a d w o r k e r ;
p r i v a t e V e c t o r q u e r y R e s u l t s ;
p r i v a t e S t r i n g m e s s a g e = " И н и ц и а л и з а ц и я " ;
p u b l i c s y n c h r o n i z e d v o i d s t a r t ( ) {
/ / Ф у н к ц и я " s t a r t " в ы з ы в а е т с я к а ж д ы й р а з п р и с о з д а н и и п о т о к а T h r e a d if ( w o r k e r = = null) {
m e s s a g e = " С о е д и н е н и е с Б Д " ; w o r k e r = n e w T h r e a d ( t h i s ) ;
w o r k e r . s t a r t ( ) ;
}
}
/ / ф у н к ц и я r u n в ы з ы в а е т с я и з м е т о д о в о б ъ е к т а T h r e a d , p u b l i c v o i d r u n ( ) {
/ / З а д а н и е с т р о к и U R L - а д р е с а и с т о ч н и к а Б Д S t r i n g url = " j d b c : o d b c : A u t h o r s " ;
/ / З а д а н и е с т р о к и з а п р о с а
S t r i n g q u e r y = " S e l e c t * f r o m A u t h o r s " ; t r y {
/ / И н и ц и а л и з а ц и я д р а й в е р а
C l a s s . f o r N a m e ( " s u n . j d b c . o d b c . J d b c O d b c D r i v e r " ) ;