Menú
Está libre
registro
hogar  /  Problemas/ Guía de Internet: toda la diversión en la red. Uso del modelo de objetos de documento XML Cómo crear un archivo XML delphi

Guía de viaje por Internet: toda la diversión en la web. Uso del modelo de objetos de documento XML Cómo crear un archivo XML delphi

PEDIR UNA SOLUCIÓN A DELPHI
Delphi es el segundo lenguaje de programación más importante que los estudiantes conocen con mayor frecuencia en el proceso de aprendizaje. Este es el comienzo del aprendizaje de la programación orientada a objetos. Yo, como estudiante, llegué a la conclusión de que no método más fácil aprender un idioma que escribir una calculadora en él. Incluso si implementa una función rudimentaria para sumar dos números, arrojará luz sobre muchas cosas.

CodeGaear, Delphi 7, Lazarus son diferentes compiladores, programas que transferirán el código que escribas a la máquina, convirtiéndolo en unos y unos. Todos estos son programas para crear programas, no lenguajes de programación separados. Estos compiladores utilizan el lenguaje de programación Object Pascal, que es la base del lenguaje Delphi, que es similar en sintaxis al Pascal ordinario, pero funcionalmente difiere significativamente.

¿Cuál es la sintaxis de un lenguaje de programación?

Este es el formato para escribir varios operadores. Por ejemplo, un bucle Pascal for tiene el siguiente formato: for n: = 1 to k do, y así sucesivamente.

En el lenguaje de programación C ++, el mismo ciclo se escribe un poco diferente: for (n = 1; n Escribimos una calculadora

Esto le permitirá comprender cómo interactúan los objetos con el código del programa, qué son las "variables" y cómo funcionan las funciones matemáticas. Cualquier programación será en cualquier caso un cálculo. Un juego es también un programa que constantemente calcula algo, trabaja con números y funciones numéricas. La programación es inseparable de las matemáticas.

Usemos el entorno de desarrollo de Lazarus para escribir. Su funcionalidad no es tan rica como, digamos, CodeGear, pero se encuentra en acceso libre y está destinado a la formación.

Al abrir el entorno de desarrollo, vemos el formulario y la caja de herramientas. Aquí está el formulario.

Aquí está la caja de herramientas.

Lo primero que haremos será sumar los tres elementos que necesitamos para implementar la función de sumar dos números. Necesitamos: "Tedit" en la cantidad de tres piezas y "TButton". En la imagen de abajo se muestran en el panel con flechas. Hacemos clic en ellos una vez, y luego una vez en el formulario, y aparecen en él.

Estos son campos de texto para entrada y un botón normal. Te encuentras con estos elementos usando casi cualquier Programa de Windows... Echar un vistazo.


Ahora eliminemos estas etiquetas. Haga clic en la pestaña "Ver". Y haga clic en el elemento "Inspector de objetos". Aparecerá una ventana como esta.

Hacemos clic una vez en nuestro elemento "Botón" en el formulario y cambiamos el valor de "Título" en la ventana del inspector a cualquier otro. Por ejemplo, la palabra "Ok". Pulsamos Enter. Vemos en el formulario cómo el elemento ha cambiado de nombre.

Hagamos lo mismo con los de Edit, pero no los cambiemos de nombre, sino que los hagamos sin ningún contenido. Selecciónelos uno por uno y borre el valor de Texto en el inspector. No olvide presionar Enter.

Como resultado, nuestro formulario se ve así.


Ahora, para que funcione nuestra calculadora, debe registrar el código de programa para nuestro procedimiento de botón. Haga clic en el elemento Botón dos veces y abra el editor de código fuente.

¿Ver? Procedimiento Botón 1 Haga clic en. Este es el procedimiento que se encarga de lo que sucede cuando hacemos clic en el botón una vez. Y debería suceder lo siguiente: el programa debe mostrar la suma de los números ingresados ​​en los dos primeros campos en la tercera Edición. Escribimos el código.

Necesitamos escribir 5 líneas de código tan simples. Los comentarios y explicaciones se pueden ver en la imagen de arriba. Después de eso, presionamos este botón.

Nuestro proyecto será compilado. Se compilará en un programa. Ingresamos números en los dos primeros campos, hacemos clic en el botón y obtenemos el valor de la suma.

Conclusión

Puede hacer clic en el botón "Archivo", luego en "Guardar todo", seleccionar una carpeta para guardar y tendrá un programa completo que se puede iniciar desde el escritorio. Ahora intente averiguar por sí mismo lo que necesita reescribir en este código para que el programa divida dos números y no sume. Sugerencia: debe cambiar el tipo de datos. El siguiente video muestra un ejemplo similar, pero en el entorno Delphi 7, no en Lazarus.

Para muchos programadores de Delphi, guardar configuraciones está asociado con el uso de INI archivos en sus programas. Solicitud este método, en proyectos más o menos serios, debe evitarse, ya que esto limita la flexibilidad, lo que impide una mayor expansión del programa. Cabe decir que este enfoque es bastante popular debido a su facilidad de uso y la presencia de herramientas integradas en el entorno de desarrollo.

Sin embargo, estructurado XML archivos. Su ventaja es que el número de parámetros puede no ser fijo. Para comprender esto mejor, considere un ejemplo específico.

En el programa USearch, cuando hace clic en una entrada, aparece un menú contextual en el que se muestra una lista de elementos. Estos elementos son comandos, que a su vez se cargan desde el archivo de configuración. En caso de que la configuración se haya almacenado en INI, entonces el programa podría guardar y cargar un cierto número de comandos, por ejemplo, 10 o 50. Tan pronto como se requiera un valor mayor, tendrá que volver a escribir el código y volver a compilarlo en consecuencia.


Aplicar un enfoque usando XML archivos, podremos cargar todos los parámetros de la sección de forma dinámica. Además, el archivo de configuración se volverá más elegante, sin una numeración de parámetros redundante. Pero, medios estándar trabajar con XML Delphi tiene muchas desventajas, por lo que recomiendo usar biblioteca estándar MSXML... Suele estar incluido por defecto en sistemas operativos Familia Windows.


Para conectar MSXML, necesitamos crear un archivo de interfaz con una lista de todas las funciones importándolo desde el servidor COM. Se han escrito muchos artículos detallados sobre cómo importar la interfaz, pero le sugiero que descargue el archivo MSXML2_TLB.PAS listo para usar. Una vez descargado el archivo, colóquelo junto a su proyecto o suéltelo en la carpeta lib del entorno Delphi. Así que todo programas creados podrá usar el módulo MSXML, solo necesita agregar la línea MSXML2_TLB a uses.

Para mayor claridad, considere el siguiente ejemplo de uso de esta biblioteca:

Procedimiento LoadData; var XMLDoc: DOMDocument; Raíz: IXMLDOMElement; comenzar XMLDoc: = CoDOMDocument.Create; XMLDoc.Load ("settins.xml"); Raíz: = XMLDoc.DocumentElement; ShowMessage (Root.SelectSingleNode ("tamaño / ancho"). Texto); Raíz: = nulo; XMLDoc: = nulo; fin;

Primero, se crea una instancia de la clase DOMDocument y luego el contenido del archivo settings.xml se carga en la memoria. Dado que por el estándar cualquier XML el archivo debe contener la etiqueta raíz (en este caso config), entonces necesitamos obtenerlo usando la función DocumentElement... Luego, el contenido se muestra entre las etiquetas. , que a su vez se encuentran entre las etiquetas ... Por lo tanto, desde el archivo settings.xml, nuestro método mostrará el texto en el MessageBox "100 px".

500px 100px

Aquí se aplica el método SelectSingleNode, que toma una cadena como parámetro

¡Bienvenido! Este blog trata sobre Internet y las computadoras, o mejor dicho, fue dedicado a ellos.

Probablemente, quede claro de inmediato que no han aparecido nuevos artículos en el sitio durante muchos años. Sí, ese es el destino de la mayoría de los blogs. Este proyecto fue una vez una empresa ambiciosa, y el autor, como muchos otros que escribieron en ese momento, tenía planes ambiciosos para convertirse en uno de los mejores blogueros rusos. Bueno, si miras ahora, entonces de esos blogs que se crearon simultáneamente con el mío, la mayoría ya ha desaparecido en la eternidad. Y simplemente no tuve tiempo suficiente para escribir un blog. Entonces sí, ya no se actualiza. Aunque una vez nosotros con este sitio ganamos el concurso "Blog de Runet 2011".

Incluso tuve la idea de eliminar todo esto, pero luego revisé los materiales antiguos y me di cuenta de que aún pueden ser útiles para los lectores. Sí, algunos artículos están desactualizados (si tengo suficiente fuerza, recibirán las notas apropiadas), pero el sitio, por ejemplo, puede ser útil para principiantes; aquí puede leer sobre conceptos básicos Internet, aprenda a configurar Internet, Windows o incluso decida cambiarse a Linux. Así que mire las rúbricas y elija la que sea adecuada para usted.

Y, sin embargo, espero que esto sea más que un blog, sino una verdadera guía de Internet. El sitio se puede ver en el modo de directorio, donde todos los artículos disponibles están estructurados por categoría. Y quién sabe, tal vez algún día comiencen a aparecer aquí nuevos artículos de alta calidad.

Lijadora

Picodi.ru es un portal de descuentos de International Coupons, un experto polaco en ahorros y compras baratas. Los polacos son considerados una de las naciones más económicas del mundo, por lo que no es de extrañar que este tipo de proyecto surgiera de la startup polaca kodyrabatowe.pl. ¿Cómo puede ser útil este portal para un usuario normal de Internet en Rusia?

Los teléfonos Android modernos son más que teléfonos. Te acostumbras a escribir programas instalados, a su historial de llamadas y mensajes de texto, colección de fotos y más. Pero pasa el tiempo y el dispositivo que más le conviene comienza a ralentizarse, a fallar o simplemente pierde su apariencia presentable debido a astillas en la carcasa o arañazos en la pantalla. Surge la pregunta de elegir un nuevo teléfono y cambiar teléfono Android... Y si ahora pasamos por alto la cuestión de la elección, entonces "pasar" a teléfono nuevo sigue siendo un problema grave: absolutamente no desea iniciar todos los datos desde cero. De esto es de lo que vamos a hablar hoy.

Es muy probable que la mayoría de los lectores de este blog nunca hayan encontrado sistemas de control de versiones y no se encontrarán con ninguno en un futuro próximo. Es una pena. Este invento extremadamente conveniente es ampliamente utilizado por los programadores, pero, en mi opinión, podría ser muy útil para aquellos que trabajan activamente con textos. Pero, probablemente, ahora no existe un único sistema de control de versiones que sea fácil de comenzar a usar para la "oficina" ( Microsoft Office) trabaja. No obstante, creo que el material presentado en el artículo puede resultar interesante para todos los lectores.

Si ha pensado en cómo ver películas en la red desde su televisor y conectarse, este artículo es para usted. No, sé que algunos televisores ya tienen la funcionalidad de Smart TV, pero nunca he visto que funcione correctamente. Aparentemente, por lo tanto, recientemente la corporación Google demostró un dispositivo absolutamente impresionante, que de inmediato se convirtió en una sensación. Estamos hablando del transmisor multimedia Chromecast (Chromcast), una versión más avanzada y asequible del desastroso Nexus Q del año pasado.

Dongle Chromcast, que mide menos de 2 pulgadas, se conecta al puerto TV HDMI y le permite disfrutar viendo contenido web en tiempo real. Para controlar el transmisor, puede utilizar cualquier dispositivo (tableta, PC, teléfono inteligente) basado en la plataforma operativa iOS, Windows, Android o Mac OS.

Este artículo trata sobre el sistema del dispositivo. memoria android, problemas que puedan surgir por su carencia y formas de solucionarlos. No hace mucho, yo mismo me enfrenté al hecho de que mi teléfono Android comenzó a enviar mensajes regularmente sobre memoria insuficiente al intentar instalar una aplicación. Lo cual fue muy extraño para mí, dado que, según la descripción en el mercado, debería haber alrededor de 16GB, y también aumenté este volumen con una tarjeta de memoria adicional. Sin embargo, hubo un problema y tuve que jugar mucho antes de encontrar la solución correcta que no requiriera acceso de root o recuperación completa teléfono de nuevo a la condición de fábrica.

Recientemente, se ha prestado mucha atención a la construcción de sistemas de comercio electrónico, o como también se les llama - B2B (empresa a empresa). Teniendo en cuenta las recomendaciones para la construcción de sistemas de intercambio de flujo del cuerpo coordinador de tecnologías de Internet - WWW Consortium: el énfasis está en las tecnologías XML y la construcción de sistemas para el intercambio de documentos XML.

La ventaja de utilizar XML en negocio electronico- alta eficiencia de los sistemas B2B a bajo costo para su creación debido a una presentación clara y visual de la información estructurada, la capacidad de utilizar modernos protocolos de red y la creación de sistemas comerciales en tiempo real.

La independencia de la presentación de la información en la forma Documentos XML permite que diferentes empresas involucradas en el comercio electrónico produzcan software de forma independiente entre sí.

En todos los sistemas, el intercambio, por regla general, se construye de acuerdo con el mismo esquema, utilizando solicitudes HTTP. El protocolo SSL se utiliza como protocolo de seguridad de la información (pero este es un tema aparte).

Uno de posibles opciones El procesamiento de mensajes XML es la construcción de aplicaciones BIN / CGI (ISAPI) o componentes COM (servidor) que forman o procesan documentos XML.

Por un lado, la aplicación actúa como cliente, que emite una solicitud HTTP en modo POST, por otro lado, hay un servidor WEB en el lado del cual se procesa la solicitud y se emite una respuesta. El intercambio de información utiliza documentos XML.

Una de las opciones de implementación más eficientes es utilizar un analizador XML existente que admita el modelo DOM. Dicho analizador es una distribución de distribución de Win'98 o parte de IE 4.7 y superior (para Win`95) y representa el servidor COM ubicado en la biblioteca msxml.dll.

Modelo de objetos componentes (COM): presenta datos y métodos encapsulados en una sola entidad y una forma de acceder a ellos a través de un sistema de interfaces. Con las herramientas de Delphi, es bastante fácil acceder a las clases de un objeto COM (se pueden incluir varias clases en un servidor COM). Se accede a los objetos inicializando una instancia de la clase a través del sistema de interfaz. La descripción de interfaces se realiza mediante el lenguaje de definición de interfaces (IDL), que se puede realizar de forma automática mediante el entorno.

Las herramientas Delphi se utilizan para importar desde un servidor COM msxml.dll, se crean los archivos para la descripción de la interfaz IDL y el archivo para la descripción binaria de los tipos de biblioteca - TLB. Esta operacion realizado a través del menú del sistema: Proyecto | Importación de biblioteca de tipos:(Foto 1). A continuación, aparece un cuadro de diálogo (Figura 2), en el que debe seleccionar un objeto COM (en nuestro caso, el objeto está registrado con el nombre "Microsoft.XMLDom (Versión 2.0)") y crear un archivo TLB (botón Crear unidad). Usando el archivo TLB, el marco genera un archivo de descripción del servidor COM Pascal: MSXML_TLB.pas

El archivo MSXML_TLB.pas describe todas las interfaces, constantes y colases del servidor COM.

Para acceder a los objetos de un elemento COM, necesita en la directiva USOS agregue el nombre del archivo de descripción de la biblioteca (MSXML_TLB.pas). A continuación se muestra un programa simple que utiliza el analizador DOM estándar msxml.dll, que carga un documento XML y lo muestra en un elemento de campo de texto Memo1.

usos Windows, Mensajes, SysUtils, Clases, Gráficos, Controles, Formularios, Diálogos, OleServer, MSXML_TLB, StdCtrls; escribe TForm1 = clase(TForm) Button1: TButton; Memo1: TMemo; procedimiento Button1Click (Remitente: TObject); fin; var Form1: TForm1; implementación($ R * .DFM) Procedimiento TForm1.Button1Click (Remitente: Tobject); // declaración de la clase social del objeto DOMDocument; var coDoc: CoDOMDocument; // clase consistente con la interfaz IDOMDocument; var Doc: IXMLDOMDocument; empezar // crea una instancia del objeto DOMDocument; Doc: = coDoc.Create; // llamar al método Load de una instancia del objeto DOMDocument; Doc.load ("datos.xml"); // acceder a la propiedad xml de la instancia DOMDocument; Memo1.Text: = Doc.xml; fin; fin.

Concepto DOM - Modelo de objeto de documento

Cada documento XML se representa como un conjunto de muchos objetos (clases), con la ayuda de los cuales es posible acceder elementos individuales(campos de objeto). DOM: la interfaz describe el acceso tanto a objetos simples como DOMString o CharacterData, como a partes o elementos separados Elementos XML documento: DOMFragmentElement, DOMNode, DOMElement.

A continuación se muestran las propiedades y métodos más importantes de los objetos XMLDOMDocument, XMLDOMNode, XMLDOMNodeList. Cabe señalar que los métodos y funciones de los objetos DOM que se presentan a continuación (Document Object Model) son utilizados por el analizador XML de Microsoft msxml.dll y son algo más amplios que el modelo aprobado por el W3C DOM Consortium.

Más Descripción completa La interfaz de objetos DOM se puede encontrar en

Objeto XMLDOMDocument
Representa el nivel superior de la jerarquía de objetos y contiene métodos para trabajar con un documento: cargarlo, analizarlo, crear elementos, atributos, comentarios, etc. ...
Propiedades
Async Propiedad que identifica el modo de procesamiento actual
Error de análisis Devuelve una referencia al objeto de manejo de errores XMLDOMParseError
Habilitar: deshabilita la verificación de documentos.
url Devuelve la URL del documento.
documentElement Contiene una referencia al elemento raíz del documento como un objeto XMLDOMElement.
Métodos
cargar (url)
loadXML (xmlString)
Carga un documento XML,
guardar (objTarget) Guarda el documento XML en un archivo
abortar Interrupción del proceso de carga y tramitación del documento.
createAttribute (nombre) Crea un nuevo atributo con el nombre especificado para el elemento actual.
createNode (Tipo, nombre, nameSpaceURI) Crea un nodo del tipo y nombre especificados
createElement (tagName) Crea un elemento de documento con el nombre especificado.
createTextNode (datos) Crea texto dentro de un documento
getElementsByTagName (nombre de etiqueta) Devuelve una referencia a la colección de elementos del documento con el nombre de pila.
nodeFromID (idString) Encontrar un artículo por ID

Objeto XMLDOMNode
Objeto XMLDOMNode que implementa la interfaz DOM básica Nodo, está destinado a manipular un nodo separado del árbol del documento. Sus propiedades y métodos le permiten obtener y cambiar información completa sobre el nodo actual: su tipo, nombre, nombre completo, su contenido, lista de elementos secundarios, etc.
Propiedades
nodeName, baseName Devuelve el nombre del nodo actual.
prefijo Devuelve el prefijo del espacio de nombres.
tipo de datos Especifica el tipo de contenido del nodo actual.
nodeType, nodeTypeString Devuelve el tipo del nodo actual:
atributos Obtiene una lista de los atributos del nodo actual como una colección XMLDOMNamedNodeMap.
texto Devuelve el contenido del subárbol actual como texto
xml Devuelve una representación XML del subárbol actual.
nodeValue Devuelve el contenido del nodo actual.
childNodes Devuelve una lista de elementos secundarios como XMLDOMNodeList.
firstChild, lastChild Devuelve el primer / último hijo
previousSibling, nextSibling Devuelve el elemento hermano anterior / siguiente.
parentNode Contiene un enlace al elemento principal.
ownerDocument Devuelve un puntero al documento que contiene el nodo actual.
Métodos
appendChild (nuevoNiño) Agrega un nuevo hijo al nodo actual.
insertBefore (newChild, refChild) Inserta un nodo hijo y lo coloca en el subárbol actual a la izquierda del nodo especificado por refChild.
cloneNode (profundo) Crea una copia del elemento actual.
getAttribute(nombre)
getAttributeNode(nombre)
setAttribute (nombre, valor)
setAttributeNode (XMLDOMAttribute)
Acceso a atributos (crear, leer, escribir) del objeto. Nombre es el nombre del atributo, valor es su valor. Devuelve el valor de un objeto XMLDOMAttribute.
replaceChild (newChild, oldChild) removeChild (oldChild) Reemplazo del objeto oldChild de la lista actual de objetos secundarios por newChild. Eliminando el objeto oldChild
selectNodes (patternString) selectSingleNode (patternString) Devoluciones Objeto XMLDOMNodeList, seleccionado por patrón de búsqueda o primer nodo
transformNode (hoja de estilo)
transformNodeToObject (hoja de estilo, outputObject)
Asigna una hoja de estilo al subárbol del nodo actual y devuelve una cadena que es el resultado del procesamiento. El parámetro es una referencia al objeto DOMDocument que contiene las declaraciones XSL.

Uso de XML en los negocios.

Para una imagen más clara, se necesita una explicación y por qué se necesita todo esto para comprender cómo funciona:

Al construir un sistema ERP corporativo o B2B, al organizar el intercambio de información de documentos XML entre empresas o sucursales de la pr-I, se utiliza un sistema de transferencia de información probado de manera eficiente basado en servidores WEB existentes sobre protocolos HTTP.

Por un lado, la aplicación actúa como cliente, que emite una solicitud HTTP en modo POST; por otro lado, existe un servidor WEB, en el lado del cual se procesa la solicitud y se emite una respuesta. Los documentos XML se utilizan como intercambio.

Por ejemplo, en un sistema ERP corporativo simple, un programa de contabilidad (Contabilidad ACS), es necesario realizar una solicitud de factura y enviarla a una sucursal que tiene un almacén (Almacén ACS). AWP Una declaración de problema similar al crear un sistema B2B, cuando la empresa A solicita la disponibilidad de productos (hace un pedido para la compra) al proveedor B.

La empresa A y su programa actúan como cliente. El almacén es atendido por el proveedor B, que tiene un complejo de almacenes con una base de datos en un servidor SQL. El intercambio se realiza a través del servidor WEB corporativo del Proveedor V.

A continuación se muestra el siguiente algoritmo de intercambio típico:


Figura 3.
  1. Empresa A inicia proceso A(pedido de producto), que actúa como cliente WEB.
  2. Proceso A genera un documento XML (por ejemplo, una solicitud de factura) y lo transmite como una solicitud POST http al servidor WEB del Proveedor B. Como URI, se utiliza el identificador de recurso de la aplicación de procesamiento. El URI puede ser el mismo para todos los tipos de documentos o individual para cada tipo. Todo depende de la estructura del servidor B2B (WEB).
  3. El servidor WEB analiza la solicitud y genera un servidor Proceso B pasando el cuerpo del documento XML como parámetro.
    El proceso B lo inicia un servidor WEB y se procesa como una página ASP, CGI (ISAPI) - aplicación o servidor JAVA (aplicación de servidor)
  4. Proceso B- genera una solicitud al servidor de la base de datos SQL.
  5. El servidor SQL realiza las operaciones necesarias en la base de datos, genera una respuesta y la devuelve Proceso B.
  6. Según la respuesta del servidor SQL Proceso B genera un documento XML (respuesta) y lo devuelve como respuesta a una solicitud http a la aplicación cliente.
  7. Además, dependiendo de la situación del lado del cliente, se forma una nueva solicitud http o finaliza la sesión.

Algunas palabras sobre la organización del flujo de documentos.

La regla general para desarrollar un sistema de intercambio de documentos XML es:

  • En primer lugar- desarrollo de un diagrama de flujo de documentos electrónicos y su estructura;
  • en segundo lugar- desarrollo de tablas de funciones de proceso (subprocesos), es decir qué función implementará cada proceso con respecto a qué documento XML.

Cada documento XML, como un documento HTML, debe constar de un encabezado de mensaje (información entre etiquetas) y un cuerpo de mensaje (para una solicitud, esta información está enmarcada con etiquetas para responder a una solicitud). Para que un documento XML esté bien formado, es necesario enmarcar sus dos partes componentes "Título" y "Solicitud" con etiquetas, por ejemplo. El tipo de documento típico se presenta a continuación:

El título (Figura 4), en contraste Documento HTML, debe contener varios tipos de información de servicio, incluida información sobre el tipo de documento transmitido y el proceso de su procesamiento. V procesamiento de información llega el cuerpo del documento, es decir contenido enmarcado por etiquetas. Cabe señalar que la estructura de los títulos debe ser la misma para todos los tipos de documentos.

Para el proceso iniciado por el servidor, es preferible (pero no necesario) construir el algoritmo de procesamiento de la siguiente manera:


Figura 6.

Algunos puntos fundamentales a la hora de crear el lado del cliente

Como ya se explicó, al crear un documento XML, se utiliza su representación en forma de modelo DOM. A continuación se muestra un ejemplo de una parte de texto de Delphi de un programa de generación de encabezado xml de mensaje.

procedimiento TThread1.HeaderCreate (Remitente: Tobject); var // declaración de clase, necesaria para crear coDoc: CoDomDocument; // Objeto XMLDomDocument Doc: DomDocument; r: IXMLDOMElement; Nodo: IXMLDOMElement; // DOMText txt: IXMLDOMText; // atributo DOMAttribute: IXMLDOMAttribute; empezar // crear documento DOM Doc: = coDoc.Create; Doc.Set_async (falso); // inicio inicial del documento DOM Doc.LoadXML ("
"); // crea DOMElement (etiqueta<Remitente>) Nodo: = Doc.createElement ("Remitente"); // crea un nodo de texto " Typhoon LLC" txt: = Doc.createTextNode ("Typhoon LLC"); // asignación a nodo<Remitente> valor // nodo de texto " Typhoon LLC" Node.appendChild (txt); // agregar elemento<Remitente> a la raíz del documento cuando era niño r.appendChild (nodo); <De> Nodo: = Doc.createElement ("Desde"); txt: = Doc.createTextNode ("http://tayfun.ru/xml/default.asp"); Node.appendChild (txt); r.appendChild (nodo); // operaciones similares para la etiqueta<Para> Nodo: = Doc.createElement ("Para"); txt: = Doc.createTextNode ("http://irbis.ru"); Node.appendChild (txt); r.appendChild (nodo); // crea DOMElement () Nodo: = Doc.createElement ("TypeDocument"); // crea el nodo XMLDOMAttribute Att: = Doc.createAttribute ("Id", "Pedido"); // Node.appendChild (Att); r.appendChild (nodo); fin;

Cabe destacar que la declaración de la variable coDoc: CoDomDocument y Doc: DomDocument, así como su creación por el método Create (Doc: = coDoc.Create;) se realiza una vez. La declaración de variable se encuentra en la sección que describe las variables globales, y no en el procedimiento local, como se demostró para mayor claridad en este ejemplo (es decir, una variable global del tipo DomDocument por un módulo de programa).

El resultado del trabajo del programa anterior será el encabezado creado, aplicado a nuestro documento xml de ejemplo: que se muestra en la Figura 5.


Figura 5.


Figura 6.

La principal ventaja de transferir información en forma de documentos XML es que es posible formar un mensaje utilizando estructuras de tabla independientes en el DBMS tanto en el lado receptor como en el transmisor. Usando nuestro ejemplo, suponga que se requiere transferir información sobre las facturas de la Empresa A, desde el DBMS que tiene la estructura que se muestra en la Figura 6

Para generar un documento xml que contenga una factura, inicialmente se crea una consulta SQL (consulta A) con información sobre la factura en sí:

SELECCIONE* FROM Invoice_General DÓNDE InvoiceNum =: num SELECCIONE Bienes, Qulity, Precio, HZ_cod DE Bienes DÓNDE InvoiceNum =: num //: num es un parámetro que especifica el número de factura.

A continuación se muestra una parte del programa que genera el cuerpo del documento xml:

procedimiento TThread1.DataBodyCreate (Remitente: Tobject); var // declaración de la clase y el objeto XMLDomDocument// coDoc: CoDomDocument; // debe ser global para todo el módulo.// Doc: DomDocument; // declarar objetos DOMElement r: IXMLDOMElement; // DOMElement; Nodo, Nodo2: IXMLDOMElement; Nodo3, Nodo4: IXMLDOMElement; // DOMText txt: IXMLDOMText; str: String; // Número de factura: entero;- variable global - // tiene el valor 987654 // consultaA, consultaB: Cuerda;- variable global, // tiene un valor correspondiente a la consulta // consultaA - consulta A con información general sobre la factura // consultaB - consulta B información sobre los bienes descritos en la factura (ver texto) empezar Query.Close; // ver el texto "solicitud A" Query.Text: = queryA; // ejecutar la solicitud Query.ExecSQL; Query.Open; // obtener la dirección del elemento raíz r: = Doc.Get_documentElement; Nodo2: = Doc.createElement ("Solicitud"); // crea DOMElement (etiqueta) Nodo: = Doc.createElement ("Factura"); // agrega un elemento a la raíz r.appendChild (Nodo2); // agregar un elemento a Nodo2. appendChild (nodo); // crea DOMElement (etiqueta) Nodo3: = Doc.createElement ("Depurture"); // agregar un elemento a Nodo. appendChild (Nodo3); // llamar al campo "Depurture" de la solicitud str: = Query.FieldByName ("Depurture"). AsString; // crear nodo de texto = valor de campo// asigna un valor al nodo // nodo de texto, variable str Node.appendChild (txt); // operaciones similares para la etiqueta , , // , // (Campo DB "Destinatario") Nodo: = Doc.createElement ("Destino"); // el nombre del campo de la base de datos puede no ser el mismo que el nombre str: = Query.FieldByName ("Destinatario") .AsString; // etiqueta, esta es la ventaja de usar txt: = Doc.createTextNode (str); // DOM de la interfaz frente a un DBMS que admita la interfaz XML, // como ORACLE 8i o Ms SQL 2000 Node.appendChild (txt); ... // generar una solicitud de especificación de bienes // cerrar la solicitud de acceso Query.Close; // ver en el texto "solicitud B", info. Sobre bienes Query.Text: = queryВ; // asignación de valores de parámetros Query.Params.AsInteger: = InvoiceNumber; // ejecutar la solicitud Query2.ExecSQL; // acceso abierto para solicitar datos Query.Open; // crea DOMElement (etiqueta) Nodo3: = Doc.createElement ("Imems"); // agregar un elemento a Nodo. appendChild (Nodo3); // recorrer todas las líneas de la consulta tiempo no Eof.Query hacer begin Node4: = Doc.createElement ("Imem"); // agregar un elemento a Node3.appendChild (Node4); // formación de datos para la etiqueta str: = Query.FieldByName ("Precio"). AsString; txt: = Doc.createTextNode (str); Node.appendChild (txt); ... // operaciones similares para etiquetas , , fin; fin;

Como resultado de este procedimiento, se genera el siguiente texto de un documento XML:


Para formar una solicitud, se utiliza el método Open del objeto IXMLHttpRequest:

procedimiento Abierto (const bstrMethod, - tipo de método = "POST" bstrUrl, - URL del servidor varAsync, - modo de comunicación asíncrona / síncrona = verdadero bstrUser, - nombre de usuario para autenticación bstrPassword) - contraseña

Creación del lado del servidor del procesamiento de documentos

Como se señaló anteriormente, el procesamiento Solicitud HTTP se puede implementar mediante aplicaciones CGI o servlets Java. También es posible la variante de escribir páginas ASP. Pero en este caso, la transferencia de datos solo es posible mediante el método "GET" a través de la cadena de consulta. Sin embargo, manejar una solicitud HTTP para páginas ASP es más eficiente que una aplicación CGI. Sin embargo, en mi opinión, no importa cómo procesarlo, pero es más importante resolver la pregunta: cómo construir un programa de procesamiento y no por qué medios.

Si del capítulo anterior examinamos las opciones para formar un documento XML, entonces la tarea aplicación de servidor lo contrario es analizar documentos XML. A continuación se muestra una parte del programa que analiza un documento xml:

procedimiento Tthread1.DataParser (remitente: Tobject); var // declarar objetos DOMElement r, FNode: IXMLDOMElement; Str, Nombre de archivo: Cadena; parm: String; // declaración de clase social y CoDocXML, CoDocXSL, CoDocResult: CoDomDocument; // Objeto XMLDomDocument XMLDoc, XSLDoc, ResultDoc: DomDocument; // HttpStr: String; - una variable global que contiene la cadena de solicitud HTTP Empezar XMLDoc: = coDocXML.Create; XMLDoc.LoadXML (HttpStr); // obtener la dirección del elemento raíz r: = Doc.Get_documentElement; // obtiene el valor del elemento FNode: = r.SelectSingleNode ("// TypeDocument"); // obtiene el valor del atributo id = "Order" Nombre de archivo: = FNode.GetAttibute ("id"); // y formando el nombre de archivo Order.xsl Nombre de archivo: = Nombre de archivo + ". Xsl"; // crear documento XSLDoc XSLDoc: = coDocXSL.Create; XSLDoc.LoadXML (Nombre de archivo); // crear documento XMLDoc ResultDoc: = coDocResult.Create; // establecer el modo de procesamiento síncrono ResultDoc.Set_async (falso); // establecer verificación de análisis ResultDoc.validateOnParse: = true; // analizar XMLDoc usando la plantilla XSL XMLDoc.transformNodeToObject (XSLDoc, ResultDoc); // a la variable Str se le asigna un valor de texto // del documento resultante. Str: = ResultDoc.text; // encontrar un elemento FNode: = r.SelectSingleNode ("// InvoiceNumber"); // y obtén el valor del elemento parm: = FNode.text; // cerrar la solicitud de acceso Query.Close; Query.Text: = Str; // asignación de valor de parámetro Query.Params.AsString: = parm; // ejecutar la solicitud Query.ExecSQL; fin;

Todo lo más destacado del análisis radica en el uso de una plantilla XSL, que se genera individualmente para cada tipo de documento. El resultado del análisis es una cadena de consulta SQL. Posteriormente, la ejecución de la cadena de consulta SQL generada hará los cambios necesarios a los datos en el DBMS.

La ventaja de utilizar el análisis sintáctico a través de una plantilla es que también obtiene algún tipo de flexibilidad de datos y obtiene una independencia completa del algoritmo del código del programa. A continuación se muestra el texto de la plantilla XSL utilizada para procesar un documento de PEDIDO:

INSERTAR en TABREG (FROM, TO, TYPEDOC, body) VALUES (" ", "", "") INSERTAR en MERCANCÍAS (número de factura, nombre, precio, calidad) VALORES (": num", " ", "", " ")

Explicando el ejemplo anterior, cabe señalar que el uso de un par de etiquetas es de naturaleza formal, ya que después del análisis, el documento XML resultante debe contener formalmente al menos un nodo. El método ResultDoc.text asigna el valor de texto del ResultDoc obtenido durante el análisis del documento XML. En este caso, el valor es todo lo que está enmarcado por un par de etiquetas y, es decir, la consulta SQL que hemos generado.

Otra característica de la escritura de un programa es la posibilidad de utilizar el parámetro SQL. : num. El uso del parámetro simplifica el texto de la plantilla xsl. La definición del valor de los elementos correspondientes de los nodos del documento XML viene determinada inicialmente por la selección por el nombre del nodo correspondiente, por ejemplo:

XSL de un vistazo

XSL proviene de eXtensible Stylesheet Language, un lenguaje de formato de hojas de estilo ( Datos XML). Como puede ver en el encabezado, el lenguaje de hoja de estilo extensible (XSL) se utiliza para formatear datos XML. Por definición, el W3C XSL consta de dos partes:

  • XSLT - Transformación XSL. El lenguaje utilizado para transformar o formatear (transformar) documentos XML. Así, con la ayuda de XSLT, podemos obtener diferentes cortes de un conjunto de datos y formas de presentación de datos.
  • Formatear elementos. Estos elementos incluyen todos los elementos tipográficos de los datos, una vez procesados ​​con XSL. Usado solo para dar forma Páginas HTML.

Usando XSLT, podemos seleccionar los datos que necesitamos de Archivo XML y organícelos para presentarlos al usuario. Por ejemplo, en nuestro caso, hemos transformado los datos XML como Consulta SQL... El uso clásico de XSL suele dar formato a los datos en forma de páginas HTML o, más raramente, en forma de archivos RTF.

El archivo XSL describe una plantilla, según la cual se realizará la transformación de datos XML. Volviendo a las plantillas xsl, los siguientes elementos (directivas) se pueden distinguir en XSLT:

Directivas XSL descripción
xsl: aplicar-plantillas Una directiva que indica el uso de plantillas coincidentes para el atributo de selección = "nombre de la plantilla"
xsl: atributo crea un árbol de atributos y lo agrega al elemento de salida, nombre del parámetro = "nombre del atributo", el espacio de nombres es el URI del espacio de nombres (prefijo del espacio de nombres)
xsl: plantilla de llamada llama a una plantilla, atributo nombre = "URI a plantilla"
xsl: elige
xsl: cuando
xsl: de lo contrario
selección por condición xsl: cuando expr = "evaluación de expresión en script",
language = "nombre-idioma"
test = "expresión evaluada"
xsl: comentario genera un comentario en el documento de salida
xsl: copiar
xsl: copia de
copia el nodo actual en la fuente de salida o inserta un fragmento de documento en un nodo donde el atributo de selección = "nombre del nodo de fuente"
xsl: elemento crea un elemento de salida por nombre, nombre de atributo = "nombre de elemento", espacio de nombres = "referencia de espacio de nombres uri"
xsl: para cada uno vuelve a aplicar la plantilla a todos los nodos de la lista de nodos, el atributo de selección especifica la lista de nodos
xsl: si verificación de condición, establecida por el atributo de prueba como una expresión
xsl: incluir incluye plantilla externa, atributo href = "referencia URI"
xsl: salida especifica la salida, el atributo del método puede ser "xml", "html" o "texto"
xsl: param especifica el valor de los parámetros, nombre de atributo = "nombre de parámetro", seleccionar = "valor"
xsl: instrucción-de-procesamiento crea una instrucción de procesamiento, atributo nombre = "nombre de instrucción de proceso"
xsl: ordenar ordena conjunto de nodos, atributos select = "nombre de nodo", tipo de datos = tipo de datos ("texto" | "número" | Qname), orden = dirección de clasificación ("ascendente" | "descendente")
xsl: hoja de estilo define un documento xsl-templates, es el elemento raíz de XSLT
xsl: plantilla define una plantilla xsl, atributo name = "prefijo URI al nombre de la plantilla", match = "una indicación del nodo al que se aplica la plantilla"
xsl: texto genera texto en el flujo de salida, atributo disable-output-escaping = "sí" o "no", indica la capacidad de generar caracteres ESC
xsl: valor de inserta el valor del nodo seleccionado como texto, atributo select = "puntero al nodo" del cual se toma el valor
xsl: variable especifica el valor de los límites de las variables, nombre del atributo = "nombre de la variable", seleccione = "cálculo del valor de la variable"
xsl: con-param aplica el parámetro a la plantilla, nombre de atributo = "nombre de parámetro", seleccione = expresión para evaluar el contexto actual, valor predeterminado "."

Conclusión

Finalmente, debe tenerse en cuenta que el uso del analizador XML estándar msxml.dll no es la única herramienta para analizar y crear documentos XML. Por ejemplo, para crear documentos XML utilice eficazmente los componentes TPageProduser y TableProduser... Pero este artículo solo enfatiza la amplitud y aplicabilidad del modelo DOM en la práctica.

El autor estará muy agradecido por sus comentarios sobre la relevancia del tema, el contenido general, el estilo de presentación, así como todos los demás comentarios que ayudarán a mejorar aún más la calidad de la redacción de una colección de artículos y la publicación de un libro que cubra el tema. tema del lado práctico del uso de documentos XML en el comercio electrónico. Más información detallada sobre el aspecto práctico del uso de documentos electrónicos se puede encontrar en el sitio del autor www.eDocs.al.ru También está previsto colocar los textos originales y los ejemplos en el sitio del autor.

XML se utiliza cada vez más para almacenar información e intercambiarla entre aplicaciones y sitios web. En muchas aplicaciones, este lenguaje se utiliza como base para almacenar datos, en otras, para exportar e importar datos XML. Por tanto, es hora de que los desarrolladores empiecen a pensar en cómo se pueden utilizar los datos XML en sus propias aplicaciones.

En este artículo, veremos el modelo de objetos de documento XML (DOM) y la implementación de Microsoft del DOM XML.

XML DOM es un modelo de objetos que proporciona al desarrollador objetos para cargar y procesar archivos XML. El modelo de objetos consta de los siguientes objetos principales: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap y XMLDOMParseError. Cada uno de estos objetos (excepto XMLDOMParseError) contiene propiedades y métodos que le permiten obtener información sobre el objeto, manipular los valores y la estructura del objeto y navegar por la estructura de un documento XML.

Veamos los principales objetos DOM XML y mostremos algunos ejemplos de su uso en Borland Delphi.

Usando XML DOM en Borland Delphi

Para utilizar Microsoft XML DOM en aplicaciones Delphi, debe conectar la biblioteca de tipos adecuada al proyecto. Para ello ejecutamos el comando Proyecto | Importar biblioteca de tipos y en el cuadro de diálogo Importar biblioteca de tipos, seleccione la biblioteca Microsoft XML versión 2.0 (Versión 2.0), que generalmente se encuentra en el archivo Windows \ System \ MSXML.DLL

Después de hacer clic en el botón Crear unidad, se creará el módulo de interfaz MSXML_TLB, que nos permitirá utilizar los objetos DOM de XML: DOMDocument, XMLDocument, XMLHTTPRequest y varios otros, implementados en la biblioteca MSXML.DLL. La referencia al módulo MSXML_TLB debe estar en la lista Usos.

Dispositivo DOM XML

El modelo de objetos de documento representa un documento XML en una estructura de árbol de ramas. Las API XML DOM permiten que las aplicaciones naveguen por el árbol del documento y manipulen sus ramas. Cada rama puede tener un tipo específico (DOMNodeType), según el cual se determinan las ramas principal y secundaria. La mayoría de los documentos XML contienen ramas de tipo elemento, atributo y texto. Los atributos son un tipo especial de rama y no son ramas secundarias. Se utilizan métodos especiales proporcionados por los objetos DOM XML para manipular atributos.

Además de implementar las interfaces recomendadas por el World Wide Web Consortium (W3C), Microsoft XML DOM contiene métodos que admiten XSL, XSL Patterns, Namespaces y tipos de datos. Por ejemplo, el método SelectNodes le permite usar la sintaxis de patrón XSL para buscar ramas en un contexto específico, y el método TransformNode admite el uso de XSL para realizar transformaciones.

Prueba de documento XML

Como ejemplo de documento XML, tomemos un directorio de CD-ROM de música, que tiene la siguiente estructura:

Imperio burlesco Bob Dylan Estados Unidos Columbia 10.90 1985 Esconde tu corazón Bonnie tylor Reino Unido Registros CBS 9.90 1988 ... Libera mi corazón Joe Cocker Estados Unidos EMI 8.20 1987

Ahora estamos listos para comenzar a mirar el modelo de objetos DOM XML, comenzando con el objeto XMLDOMDocument.

Documento XML - Objeto XMLDOMDocument

Trabajar con un documento XML comienza con su carga. Para hacer esto, usamos el método Load, que tiene un solo parámetro que especifica la URL del documento cargado. Al cargar archivos desde un disco local, solo se especifica el nombre completo del archivo (en este caso, se puede omitir el protocolo file: ///). Si el documento XML se almacena como una cadena, utilice el método LoadXML para cargar el documento.

La propiedad Async se utiliza para controlar cómo se carga el documento (sincrónico o asincrónico). De forma predeterminada, esta propiedad se establece en True, lo que indica que el documento se carga de forma asincrónica y el control se devuelve a la aplicación antes de que el documento se cargue por completo. De lo contrario, el documento se carga sincrónicamente y luego debe verificar el valor de la propiedad ReadyState para ver si el documento se ha cargado o no. También puede crear un controlador de eventos para el evento OnReadyStateChange que tomará el control cuando cambie el valor de la propiedad ReadyState.

A continuación, se muestra cómo cargar un documento XML utilizando el método Load:

Utiliza ... MSXML_TLB ... procedimiento TForm1.Button1Click (Remitente: TObject); var XMLDoc: IXMLDOMDocument; comenzar XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.Load ('C: \ DATA \ DATA.xml'); // // Aquí es donde el código que manipula // el documento XML y sus ramas // XMLDoc: = Nil; fin;

Una vez cargado el documento, podemos acceder a sus propiedades. Entonces, la propiedad NodeName contendrá el valor #document, la propiedad NodeTypeString contendrá el valor del documento y la propiedad URL contendrá el valor file: /// C: /DATA/DATA.xml.

Manejo de errores

De particular interés son las propiedades relacionadas con el procesamiento de documentos durante la carga. Por ejemplo, la propiedad ParseError devuelve un objeto XMLDOMParseError que contiene información sobre un error que se produjo al procesar el documento.

Para escribir un controlador de errores, puede agregar el siguiente código:

Var XMLError: IXMLDOMParseError; ... XMLDoc.Load ('C: \ DATA \ DATA.xml'); XMLError: = XMLDoc.ParseError; Si XMLError.ErrorCode<>0 Entonces // // Aquí manejamos el error // Else Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: = Nulo;

Para saber qué información se devuelve en caso de error, cambie la siguiente entrada del directorio:

Imperio burlesco Bob Dylan Estados Unidos Columbia 10.90 1985

quitar el elemento de cierre en la segunda línea:</p><p> <CD> <TITLE>Imperio burlesco <ARTIST>Bob Dylan</ARTIST> <COUNTRY>Estados Unidos</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>Ahora escribamos código que devuelva los valores de propiedad del objeto XMLDOMParseError:</p><p>XMLError: = XMLDoc.ParseError; Si XMLError.ErrorCode<>0 Luego, con XMLError, Memo1.Lines comienzan a Agregar ("Archivo:" + URL); Agregar ('Código:' + IntToStr (Código de error)); Agregar ("Error:" + Razón); Agregar ('Text:' + SrcText); Agregar ('Línea:' + IntToStr (Línea)); Agregar ('Posición:' + IntToStr (LinePos)); finalizar Else Memo1.Lines.Add (XMLDoc.XML); Fin;</p><p>y ejecutar nuestra aplicación. Como resultado, obtenemos la siguiente información sobre el error.</p> <p>Como puede ver en el ejemplo anterior, la información devuelta por el objeto XMLDOMParseError es suficiente para localizar el error y comprender la causa de su aparición.</p> <p>Ahora restauraremos el elemento de cierre. <TITLE>en nuestro documento y continuar con nuestra discusión sobre XML DOM.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Acceder al árbol de documentos</h2> <p>Para acceder al árbol del documento, puede obtener el elemento raíz y luego iterar sobre sus ramas secundarias, o encontrar una rama específica. En el primer caso, obtenemos el elemento raíz a través de la propiedad DocumentElement, que devuelve un objeto de tipo XMLDOMNode. A continuación, se muestra cómo usar la propiedad DocumentElement para obtener el contenido de cada elemento secundario:</p><p>Var Node: IXMLDOMNode; Raíz: IXMLDOMElement; I: entero; ... Raíz: = XMLDoc.DocumentElement; Para I: = 0 a Root.ChildNodes.Length-1, haga Begin Node: = Root.ChildNodes.Item [I]; Memo1.Lines.Add (Node.Text); Fin;</p><p>Para nuestro documento XML, obtenemos el siguiente texto.</p> <p>Si estamos interesados ​​en una rama específica o una rama debajo de la primera rama secundaria, podemos usar el método NodeFromID o el método GetElementByTagName del objeto XMLDOMDocument.</p> <p>El método NodeFromID requiere un identificador único como se define en el esquema XML o la definición de tipo de documento (DTD) y devuelve una rama con ese identificador.</p> <p>El método GetElementByTagName requiere una cadena con un elemento específico (etiqueta) y devuelve todas las ramas con este elemento. A continuación, se explica cómo utilizar este método para encontrar todos los artistas en nuestro directorio de CD-ROM:</p><p>Nodos: IXMLDOMNodeList; Nodo: IXMLDOMNode; ... Nodos: = XMLDoc.GetElementsByTagName ("ARTISTA"); Para I: = 0 a Nodes.Length-1, haga Begin Node: = Nodes.Item [I]; Memo1.Lines.Add (Node.Text); Fin;</p><p>Para nuestro documento XML, obtendremos el siguiente texto</p> <p>Tenga en cuenta que el método SelectNodes del objeto XMLDOMNode proporciona una forma más flexible de acceder a las ramas del documento. Pero más sobre eso a continuación.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Rama de documento: objeto XMLDOMNode</h2> <p>El objeto XMLDOMNode representa una rama de documento. Ya encontramos este objeto cuando obtuvimos el elemento raíz del documento:</p><p>Raíz: = XMLDoc.DocumentElement;</p><p>Para obtener información sobre una rama de un documento XML, puede utilizar las propiedades del objeto XMLDOMNode (Tabla 1).</p> <p>Para acceder a los datos almacenados en una rama, es común usar la propiedad NodeValue (disponible para atributos, ramas de texto, comentarios, instrucciones de procesamiento y secciones CDATA), o la propiedad Text, que devuelve el contenido de texto de la rama, o la propiedad NodeTypedValue. Sin embargo, este último solo se puede usar para ramas con elementos escritos.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Navegando por el árbol del documento</h3> <p>El objeto XMLDOMNode proporciona muchas formas de navegar por el árbol del documento. Por ejemplo, la propiedad ParentNode (tipo XMLDOMNode) se utiliza para acceder a la rama principal, se accede a las ramas secundarias a través de las propiedades ChildNodes (tipo XMLDOMNodeList), FirstChild y LastChild (tipo XMLDOMNode), etc. La propiedad OwnerDocument devuelve un objeto XMLDOMDocument que identifica el propio documento XML. Las propiedades enumeradas anteriormente facilitan la navegación por el árbol del documento.</p> <p>Ahora recorramos todas las ramas del documento XML:</p><p>Raíz: = XMLDoc.DocumentElement; Para I: = 0 a Root.ChildNodes.Length-1, haga Begin Node: = Root.ChildNodes.Item [I]; Si Node.HasChildNodes Then GetChilds (Node, 0); Fin;</p><p>Como se señaló anteriormente, los SelectNodes del objeto XMLDOMNode proporcionan una forma más flexible de acceder a las ramas del documento. Además, existe un método SelectSingleNode que devuelve solo la primera rama del documento. Ambos métodos le permiten definir plantillas XSL para búsquedas de sucursales.</p> <p>Veamos el proceso de usar el método SelectNodes para buscar todas las ramas que tienen una rama CD y una sub-rama PRICE:</p><p>Raíz: = XMLDoc.DocumentElement; Nodos: = Root.SelectNodes ('CD / PRICE');</p><p>Todas las subramas de PRICE de la sucursal de CD se colocarán en la colección Nodes. Volveremos a discutir las plantillas XSL un poco más tarde.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Manipular ramas secundarias</h3> <p>Para manipular ramas secundarias, podemos usar los métodos del objeto XMLDOMNode (Tabla 2).</p> <p>Para eliminar por completo el registro del primer disco, debe ejecutar el siguiente código:</p><p>Var XMLDoc: IXMLDOMDocument; Raíz: IXMLDOMNode; Nodo: IXMLDOMNode; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = Falso; XMLDoc.Load ('C: \ DATA \ DATA.xml'); // Obtener el elemento raíz Root: = XMLDoc.DocumentElement; Nodo: = Raíz; // Elimina la primera rama secundaria Node.RemoveChild (Node.FirstChild);</p><p>Tenga en cuenta que en este ejemplo estamos eliminando la primera rama secundaria. A continuación se muestra cómo eliminar el primer elemento de la primera rama secundaria:</p><p>Var XMLDoc: IXMLDOMDocument; Raíz: IXMLDOMNode; Nodo: IXMLDOMNode; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.Load ('C: \ DATA \ DATA.xml'); // Obtener el elemento raíz Root: = XMLDoc.DocumentElement; // y la primera rama secundaria Node: = Root.FirstChild; // Elimina la primera rama secundaria Node.RemoveChild (Node.FirstChild);</p><p>En el ejemplo anterior, no eliminamos la primera rama. <CD>…</CD> y el primer elemento de la rama es <TITLE>….

Ahora agreguemos una nueva rama. A continuación se muestra el código que muestra cómo agregar una nueva entrada de CD-ROM de música:

Var NewNode: IXMLDOMNode; Niño: IXMLDOMNode; ... // Crea una nueva rama - NewNode: = XMLDoc.CreateNode (1, "CD", ""); // Agregar un elemento Niño: = XMLDoc.CreateNode (1, "TITLE", ""); // Agrega un elemento NewNode.AppendChild (Child); // Y establezca su valor Child.Text: = 'Pink Floyd'; // Agregar un elemento <ARTIST>Niño: = XMLDoc.CreateNode (1, "ARTISTA", ""); // Agrega un elemento NewNode.AppendChild (Child); // Y establezca su valor Child.Text: = 'Division Bell'; // Agregar un elemento <COUNTRY>Niño: = XMLDoc.CreateNode (1, "PAÍS", ""); // Agrega un elemento NewNode.AppendChild (Child); // Y establezca su valor Child.Text: = 'UK'; // Agregar un elemento <COMPANY>Niño: = XMLDoc.CreateNode (1, "EMPRESA", ""); // Agrega un elemento NewNode.AppendChild (Child); // Y establezca su valor Child.Text: = 'EMI Records Ltd.'; // Agregar un elemento <PRICE>Niño: = XMLDoc.CreateNode (1, "PRICE", ""); // Agrega un elemento NewNode.AppendChild (Child); // Y establece su valor Child.Text: = '11 .99 "; // Agrega un elemento <YEAR>Niño: = XMLDoc.CreateNode (1, 'YEAR', ''); // Agrega un elemento NewNode.AppendChild (Child); // Y establezca su valor Child.Text: = '1994'; // Y agrega una rama Root.AppendChild (NewNode); ...</p><p>El código anterior muestra los siguientes pasos para agregar una nueva rama:</p> <ul><li>Creando una nueva rama usando el método CreateNode: <ul><li>creando un elemento usando el método CreateNode;</li> <li>agregar un elemento a una rama usando el método AppendChild;</li> <li>establecer el valor de un elemento a través de la propiedad Text;</li> <li>… Repita para todos los elementos.</li> </ul></li> <li>Agregar una nueva rama al documento usando el método AppendChild.</li> </ul><p>Recuerde que el método AppendChild agrega una rama al final del árbol. Para agregar una rama a un lugar específico en el árbol, debe usar el método InsertBefore.</p> <h2>Conjunto de ramas: objeto XMLDOMNodeList</h2> <p>El objeto XMLNodeList contiene una lista de ramas, que se pueden crear mediante los métodos SelectNodes o GetElementsByTagName, y también se obtienen de la propiedad ChildNodes.</p> <p>Ya hemos discutido el uso de este objeto en el ejemplo proporcionado en la sección "Navegación por el árbol del documento". He aquí algunos comentarios teóricos.</p> <p>El número de ramas en la lista se puede obtener como el valor de la propiedad Longitud. Las ramas están indexadas de 0 a Longitud-1, y se puede acceder a cada rama individual a través del elemento indexado correspondiente en la matriz de elementos.</p> <p>También se puede navegar por la lista de ramas utilizando el método NextNode, que devuelve la siguiente rama de la lista, o Nil si la rama actual es la última. Para volver al principio de la lista, llame al método Reset.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Crea y guarda documentos</h2> <p>Por lo tanto, hemos cubierto cómo puede agregar ramas y elementos a documentos XML existentes. Ahora creemos un documento XML sobre la marcha. En primer lugar, recuerde que un documento se puede cargar no solo desde una URL, sino también desde una cadena normal. A continuación, se explica cómo crear un elemento raíz, que luego se puede usar para construir dinámicamente el resto de los elementos (que ya cubrimos en la sección Manipulación de ramas secundarias):</p><p>Var XMLDoc: IXMLDOMDocument; Raíz: IXMLDOMNode; Nodo: IXMLDOMNode; S: WideString; ... S: = ' <CATALOG></CATALOG>'; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.LoadXML (S); Raíz: = XMLDoc.DocumentElement; Nodo: = XMLDoc.CreateNode (1, 'CD', ''); Root.AppendChild (nodo); Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: = Nulo;</p><p>Después de crear el documento XML, guárdelo en un archivo utilizando el método Guardar. Por ejemplo:</p> <p>XMLDoc.Save ('C: \ DATA \ NEWCD.XML');</p> <p>Además de guardar en un archivo, el método Save le permite guardar un documento XML en un nuevo objeto XMLDOMDocument. En este caso, el documento se procesa por completo y, como resultado, se verifica su estructura y sintaxis. A continuación, se explica cómo guardar un documento en otro objeto:</p><p>Procedimiento TForm1.Button2Click (Remitente: TObject); var XMLDoc2: IXMLDOMDocument; comenzar XMLDoc2: = CoDOMDocument.Create; XMLDoc.Save (XMLDoc2); Memo2.Lines.Add (XMLDoc2.XML); ... XMLDoc2: = Nulo; fin;</p><p>Por último, tenga en cuenta que el método Save también le permite guardar el documento XML en otros objetos COM que admiten las interfaces IStream, IPersistStream o IPersistStreamInit.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Usar plantillas XSL</h2> <p>Al discutir el método SelectNodes del objeto XMLDOMNode, mencionamos que proporciona una forma más flexible de acceder a las ramas del documento. La flexibilidad es que puede especificar una plantilla XSL como criterio para seleccionar sucursales. Estas plantillas proporcionan un poderoso mecanismo para encontrar información en documentos XML. Por ejemplo, para obtener una lista de todos los títulos de CD-ROM de música en nuestro directorio, puede ejecutar la siguiente consulta:</p><p>Para saber qué discos de artistas se lanzan en los EE. UU., La solicitud se forma de la siguiente manera:</p><p>Nodos: = Root.SelectNodes ('CD / ARTISTA');</p><p>A continuación, se explica cómo encontrar la primera unidad en un directorio:</p><p>Nodos: = Root.SelectNodes ('CD / TITLE');</p><p>Y última:</p><p>Nodos: = Root.SelectNodes ('CD / TITLE');</p><p>Para encontrar los discos de Bob Dylan, puede ejecutar la siguiente consulta:</p><p>Nodos: = Root.SelectNodes (‘CD [$ any $ ARTIST =" Bob Dylan "] / TITLE’);</p><p>y para obtener una lista de los discos fabricados después de 1985, ejecutamos la siguiente consulta:</p><p>Nodos: = Root.SelectNodes ('CD / TITLE');</p><p>Una discusión más detallada de la sintaxis XSL requiere una publicación separada. Para intrigar a los lectores y fomentar una mayor investigación, daré solo un pequeño ejemplo del posible uso de XSL. Digamos que necesitamos convertir nuestro directorio en una tabla HTML normal. Usando los métodos tradicionales, debemos iterar sobre todas las ramas del árbol y para cada elemento recibido formar las etiquetas correspondientes. <TD>…</TD>.</p> <p>Usando XSL, simplemente creamos una plantilla (u hoja de estilo) que especifica qué y cómo transformar. Luego, superponemos esta plantilla en nuestro catálogo, y ya está: tenemos el texto de la plantilla XSL que transforma el catálogo en una tabla (Listado 2).</p> <p>El código para superponer una plantilla XSL en nuestro directorio se ve así:</p><p>Procedimiento TForm1.Button2Click (Remitente: TObject); var XSLDoc: IXMLDOMDocument; comenzar XSLDoc: = CoDOMDocument.Create; XSLDoc.Load ('C: \ DATA \ DATA.xsl'); Memo2.Text: = XMLDoc.TransformNode (XSLDoc); XSLDoc: = cero; fin;</p><p>Concluyendo nuestra discusión sobre XSL, debería decirse que en la actualidad este lenguaje se usa activamente para la transformación entre varios documentos XML, así como para formatear documentos.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Conclusión</h2> <p>Por razones obvias, es imposible cubrir todos los objetos DOM XML de Microsoft y proporcionar ejemplos de su uso en un artículo. Aquí acabamos de tocar los problemas básicos del uso de XML DOM en aplicaciones. Mesa 3 muestra todos los objetos implementados en el DOM XML de Microsoft.</p> <p>ComputerPress 12 "2000</p> <script>document.write("<img style='display:none;' src='//counter.yadro.ru/hit;artfast?t44.1;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";h"+escape(document.title.substring(0,150))+ ";"+Math.random()+ "border='0' width='1' height='1' loading=lazy loading=lazy>");</script> </div> </div> </div> </div> <aside class="col-lg-4 col-md-12 col-md-offset-4 col-lg-offset-0" id="right"> <div> </div> <br/> <div> </div> <br/> <div> </div> <br/> <div> </div> <br/> </aside> </div> </div> </div> <div class="popup" id="share"> <div class="perfect-scroll" style="text-align: center"> <div style="margin-bottom: 20px"> <strong>La descarga comenzará ahora ...</strong> <br>No olvides compartir material <br>en las redes sociales con tu <br>colegas</div> <div> <div class="ya-share2" data-services="vkontakte,facebook,odnoklassniki,moimir,gplus" data-counter=""></div> </div> </div> <div class="close-pop pull-right"> <svg width="10px" height="10px" viewBox="0 0 10 10"> <path fillrule="evenodd" d="M 6.41 5C 6.41 5 9.24 7.83 9.24 7.83 9.63 8.22 9.63 8.85 9.24 9.24 8.85 9.63 8.22 9.63 7.83 9.24 7.83 9.24 5 6.41 5 6.41 5 6.41 2.17 9.24 2.17 9.24 1.78 9.63 1.15 9.63 0.76 9.24 0.37 8.85 0.37 8.22 0.76 7.83 0.76 7.83 3.59 5 3.59 5 3.59 5 0.76 2.17 0.76 2.17 0.37 1.78 0.37 1.15 0.76 0.76 1.15 0.37 1.78 0.37 2.17 0.76 2.17 0.76 5 3.58 5 3.58 5 3.58 7.83 0.76 7.83 0.76 8.22 0.37 8.85 0.37 9.24 0.76 9.63 1.15 9.63 1.78 9.24 2.17 9.24 2.17 6.41 5 6.41 5Z"></path> </svg> </div> </div> <section id="views"> <div class="container"> </div> </section> <script type="text/javascript"> $(document).ready( function () { $('.kursiv').readmore({ speed: 75, maxHeight: 84, heightMargin: 16, moreLink: '<a href="#"><span>Показать полностью</span>', lessLink: '<a href="#"><span>Скрыть</span></a>', } ); } ); </script> <style> div.kursiv { margin-bottom: 0; } #razrabotka { margin-top: 30px; } .readmore-js-toggle { font-style: italic; color: #999; display: inline; margin-right: 10px; font-size: 14px; cursor: pointer; border-bottom: 1px dotted #e6e6e6; } </style></section> <footer> <div class="container"> <div class="row"> <div class="col-xs-16 col-sm-4 col-md-3"> <p>© 2021, mkr-novo2.ru, Internet. Educación. Programas. Firmware. Instalacion y configuracion. Navegantes</p> <div class="social"> <a target="_blank" href=""> <svg width="32px" height="19px" viewBox="0 0 32 19"> <path fillRule="evenodd" d="M 15.36 18.01C 15.36 18.01 17.24 18.01 17.24 18.01 17.24 18.01 17.81 17.94 18.1 17.64 18.36 17.37 18.35 16.85 18.35 16.85 18.35 16.85 18.32 14.41 19.49 14.05 20.64 13.7 22.12 16.4 23.69 17.45 24.87 18.23 25.77 18.06 25.77 18.06 25.77 18.06 29.97 18.01 29.97 18.01 29.97 18.01 32.16 17.87 31.12 16.21 31.03 16.07 30.51 14.97 28 12.72 25.37 10.35 25.72 10.74 28.89 6.65 30.82 4.16 31.59 2.65 31.35 2 31.12 1.38 29.7 1.54 29.7 1.54 29.7 1.54 24.98 1.57 24.98 1.57 24.98 1.57 24.63 1.52 24.37 1.67 24.12 1.82 23.95 2.16 23.95 2.16 23.95 2.16 23.21 4.09 22.21 5.72 20.11 9.18 19.27 9.36 18.92 9.15 18.12 8.65 18.32 7.14 18.32 6.07 18.32 2.72 18.85 1.32 17.3 0.96 16.79 0.84 16.41 0.76 15.1 0.75 13.41 0.73 11.99 0.76 11.18 1.14 10.64 1.39 10.23 1.96 10.48 1.99 10.79 2.03 11.5 2.18 11.88 2.67 12.36 3.31 12.34 4.74 12.34 4.74 12.34 4.74 12.62 8.68 11.69 9.17 11.06 9.5 10.18 8.82 8.31 5.68 7.35 4.08 6.62 2.3 6.62 2.3 6.62 2.3 6.48 1.97 6.23 1.8 5.93 1.58 5.51 1.51 5.51 1.51 5.51 1.51 1.02 1.54 1.02 1.54 1.02 1.54 0.35 1.56 0.1 1.84-0.12 2.09 0.08 2.62 0.08 2.62 0.08 2.62 3.6 10.57 7.57 14.57 11.22 18.25 15.36 18.01 15.36 18.01 15.36 18.01 15.36 18.01 15.36 18.01Z"/> </svg> </a> <a target="_blank" href=""> <svg viewBox="0 0 25 25" width="25px" height="25px"> <path class="st0" d="M12.5,12.7c3.2,0,5.8-2.6,5.8-5.8c0-3.2-2.6-5.8-5.8-5.8C9.3,1,6.7,3.6,6.7,6.8C6.7,10,9.3,12.7,12.5,12.7z M12.5,3.9c1.6,0,2.9,1.3,2.9,2.9c0,1.6-1.3,2.9-2.9,2.9c-1.6,0-2.9-1.3-2.9-2.9C9.6,5.2,10.9,3.9,12.5,3.9z M19.2,13.4 c-0.3-0.7-1.2-1.2-2.5-0.3c-1.6,1.3-4.3,1.3-4.3,1.3s-2.6,0-4.3-1.3c-1.2-1-2.1-0.4-2.5,0.3c-0.6,1.2,0.1,1.7,1.5,2.7 c1.3,0.8,3,1.1,4.1,1.2l-0.9,0.9c-1.3,1.3-2.6,2.6-3.4,3.4c-0.5,0.5-0.5,1.4,0,1.9l0.2,0.2c0.5,0.5,1.4,0.5,1.9,0l3.4-3.4 c1.3,1.3,2.6,2.6,3.4,3.4c0.5,0.5,1.4,0.5,1.9,0l0.2-0.2c0.5-0.5,0.5-1.4,0-1.9l-3.4-3.4l-0.9-0.9c1.1-0.1,2.8-0.4,4.1-1.2 C19.2,15.1,19.8,14.5,19.2,13.4z"/> </svg> </a> <a target="_blank" href="https://facebook.com/"> <svg width="26px" height="25px" viewBox="0 0 26 25"> <path fillRule="evenodd" d="M 24.33-0C 24.33-0 1.96-0 1.96-0 1.19-0 0.57 0.62 0.57 1.38 0.57 1.38 0.57 23.62 0.57 23.62 0.57 24.38 1.19 25 1.96 25 1.96 25 14 25 14 25 14 25 14 15.32 14 15.32 14 15.32 10.72 15.32 10.72 15.32 10.72 15.32 10.72 11.54 10.72 11.54 10.72 11.54 14 11.54 14 11.54 14 11.54 14 8.76 14 8.76 14 5.53 15.98 3.77 18.88 3.77 20.27 3.77 21.46 3.88 21.81 3.92 21.81 3.92 21.81 7.3 21.81 7.3 21.81 7.3 19.8 7.3 19.8 7.3 18.22 7.3 17.92 8.04 17.92 9.13 17.92 9.13 17.92 11.54 17.92 11.54 17.92 11.54 21.68 11.54 21.68 11.54 21.68 11.54 21.19 15.32 21.19 15.32 21.19 15.32 17.92 15.32 17.92 15.32 17.92 15.32 17.92 25 17.92 25 17.92 25 24.33 25 24.33 25 25.09 25 25.71 24.38 25.71 23.62 25.71 23.62 25.71 1.38 25.71 1.38 25.71 0.62 25.09-0 24.33-0Z"/> </svg> </a> <a target="_blank" href="https://youtube.com/"> <svg width="26px" height="19px" viewBox="0 0 26 19"> <path fillRule="evenodd" d="M 25.75 14.46C 25.75 14.46 25.5 16.18 24.75 16.93 23.79 17.92 22.72 17.93 22.23 17.99 18.71 18.24 13.43 18.25 13.43 18.25 13.43 18.25 6.89 18.19 4.88 18 4.32 17.89 3.06 17.92 2.11 16.93 1.35 16.18 1.11 14.46 1.11 14.46 1.11 14.46 0.86 12.45 0.86 10.44 0.86 10.44 0.86 8.55 0.86 8.55 0.86 6.54 1.11 4.52 1.11 4.52 1.11 4.52 1.35 2.81 2.11 2.05 3.06 1.06 4.14 1.06 4.63 1 8.15 0.75 13.42 0.75 13.42 0.75 13.42 0.75 13.43 0.75 13.43 0.75 13.43 0.75 18.71 0.75 22.23 1 22.72 1.06 23.79 1.06 24.75 2.05 25.5 2.81 25.75 4.52 25.75 4.52 25.75 4.52 26 6.54 26 8.55 26 8.55 26 10.44 26 10.44 26 12.45 25.75 14.46 25.75 14.46ZM 10.83 5.73C 10.83 5.73 10.83 12.72 10.83 12.72 10.83 12.72 17.62 9.24 17.62 9.24 17.62 9.24 10.83 5.73 10.83 5.73Z"/> </svg> </a> </div> </div> <div class="col-lg-2 col-sm-4 col-xs-16 links"> <h4>mkr-novo2.ru</h4> <a href="https://mkr-novo2.ru/es/category/internet/">Internet</a> <a href="https://mkr-novo2.ru/es/category/multimedia/">Multimedia</a> <a href="https://mkr-novo2.ru/es/category/navigation/">Navegantes</a> <a href="https://mkr-novo2.ru/es/category/education/">Educación</a> <a href="https://mkr-novo2.ru/es/category/at/">SOBRE</a> <a href="https://mkr-novo2.ru/es/category/problems/">Problemas</a> </div> <div class="col-lg-2 col-sm-3 col-xs-16 links"> <h4>sobre el proyecto</h4> <a href="">Realimentación</a> <a href="">Sobre el sitio</a> </div> <div class="col-lg-5 col-sm-1 col-xs-16 links"></div> <div class="col-lg-4 col-sm-5 col-xs-16 links"> </div> </div> <div class="row v-center"> <div class="col-md-8 col-xs-16"> <a data-fancybox data-type="iframe" data-src="">Contactos</a> </div> <div class="col-md-8 col-xs-16"> <div class="share pull-right"> <script type="text/javascript" src="//yastatic.net/es5-shims/0.0.2/es5-shims.min.js" charset="utf-8"></script> <script type="text/javascript" src="//yastatic.net/share2/share.js" charset="utf-8"></script> <div class="ya-share2" data-services="vkontakte,facebook,odnoklassniki,moimir,gplus" data-counter=""></div> </div> </div> </div> </div> </footer> <a href="#bot" id="to-top"> <svg width="50px" height="50px" viewBox="0 0 50 50"> <circle cx="25.00" cy="25.00" r="25.00" fill="rgb(0,0,0)" opacity="0.37"/> <path fillRule="evenodd" d="M 33.94 24.46C 33.94 24.46 25.89 16.3 25.89 16.3 25.32 15.73 24.41 15.73 23.84 16.3 23.84 16.3 15.79 24.46 15.79 24.46 14.88 25.38 15.52 26.97 16.81 26.97 16.81 26.97 20.43 26.97 20.43 26.97 21.23 26.97 21.88 27.62 21.88 28.43 21.88 28.43 21.88 32.51 21.88 32.51 21.88 33.71 22.83 34.68 24.01 34.68 24.01 34.68 25.72 34.68 25.72 34.68 26.9 34.68 27.86 33.71 27.86 32.51 27.86 32.51 27.86 28.43 27.86 28.43 27.86 27.62 28.5 26.97 29.31 26.97 29.31 26.97 32.92 26.97 32.92 26.97 34.21 26.97 34.85 25.38 33.94 24.46Z" fill="rgb(241,241,241)"/> </svg> </a> <div class="overlay"></div> <div class="popup" id="password"> <div class="perfect-scroll"> <h2>Recuperación de contraseña <div class="close-pop pull-right"> <svg width="10px" height="10px" viewBox="0 0 10 10"> <path fillRule="evenodd" d="M 6.41 5C 6.41 5 9.24 7.83 9.24 7.83 9.63 8.22 9.63 8.85 9.24 9.24 8.85 9.63 8.22 9.63 7.83 9.24 7.83 9.24 5 6.41 5 6.41 5 6.41 2.17 9.24 2.17 9.24 1.78 9.63 1.15 9.63 0.76 9.24 0.37 8.85 0.37 8.22 0.76 7.83 0.76 7.83 3.59 5 3.59 5 3.59 5 0.76 2.17 0.76 2.17 0.37 1.78 0.37 1.15 0.76 0.76 1.15 0.37 1.78 0.37 2.17 0.76 2.17 0.76 5 3.58 5 3.58 5 3.58 7.83 0.76 7.83 0.76 8.22 0.37 8.85 0.37 9.24 0.76 9.63 1.15 9.63 1.78 9.24 2.17 9.24 2.17 6.41 5 6.41 5Z"/> </svg> </div> </h2> <div class="recover-success"> <form action="/recovery/request" data-method="post" method="post" class="recover_form"> <p>¡Ingrese su correo electrónico para recuperar su contraseña!</p> <div class="input-wrp"> <input name="email" type="text" placeholder="Introduce tu correo electrónico"> </div> <input type="submit" data-disable-with="Отправить..." class="btn green" value="enviar"> </form> </div> <div class="auth-form_error" style="padding-top: 10px"></div> </div> </div> <script> $('.user.one').click(function (e, ob) { $('.user').removeClass('active-user'); $('.user.one').addClass('active-user'); $('#user_type').val('1'); e.stopPropagation(); } ); $('.user.two').click(function (e, ob) { $('.user').removeClass('active-user'); $('.user.two').addClass('active-user'); $('#user_type').val('2'); e.stopPropagation(); } ); $('.user.three').click(function (e, ob) { $('.user').removeClass('active-user'); $('.user.three').addClass('active-user'); $('#user_type').val('3'); e.stopPropagation(); } ); function clearErrors() { $('.auth-form_error').each(function () { $(this).html(''); } ); } $('body').on('click', '.open-login-form', function (e) { $('#register, .overlay').removeClass('visible-pop'); $('#login, .overlay').addClass('visible-pop'); e.preventDefault(); } ); $('body').on('click', '.open-pass-form', function (e) { $('#register, .overlay').removeClass('visible-pop'); $('#password, .overlay').addClass('visible-pop'); e.preventDefault(); } ); $('.login_form') .on('ajax:beforeSend', function (event, xhr, settings) { clearErrors(); } ) .on('ajax:complete', function (event, xhr, status) { } ) .on('ajax:success', function (event, data, status, xhr) { if (data.status == 0) { $('.auth-form_error').html(data.text + '<br>'); } else { $('.open-register').html(data.text); var delay = 1000; window.location.href = url = window.location.href + "?login=ok"; location.replace(url); setTimeout('window.location.reload(true);', delay); } } ).on('ajax:error', function (event, xhr, status, error) { } ); $('.recover_form') .on('ajax:beforeSend', function (event, xhr, settings) { clearErrors(); } ) .on('ajax:complete', function (event, xhr, status) { } ) .on('ajax:success', function (event, data, status, xhr) { console.log(data); if (data.status == 0) { $('.auth-form_error').html(data.text + '<br>'); } else { $('.recover-success').html('<div class="success" >' + data.text + '</div>'); } } ).on('ajax:error', function (event, xhr, status, error) { } ); $('.registration_form') .on('ajax:beforeSend', function (event, xhr, settings) { var emailError = $('#emailError'); var passwordError = $('#passwordError'); var passwordVerify = $('#passwordVerifyError'); var userTypeError = $('#userTypeError'); var emailExist = $('#emailExist'); emailError.html(''); passwordError.html(''); passwordVerify.html(''); userTypeError.html(''); emailExist.hide(); } ) .on('ajax:complete', function (event, xhr, status) { } ).on('ajax:success', function (event, data, status, xhr) { // insert the failure message inside the "#account_settings" element //console.log(data); if (data.status == 0) { //$('.reg-info').html('<div class="error">' + data.text + '</div>'); if (data.text.email) { var emailError = $('#emailError'); var emailExist = $('#emailExist'); console.log(data.text.email); if (data.text.email == 'Найдена совпадающая со значением запись') { console.log('alert'); emailExist.show(); } else { emailError.html('<i class="icon-error"></i><div class="error_note_wrapper">' + '<div class="error_note">' + '<span class="error_note_text">' + data.text.email + '</span></div></div>'); } } if (data.text.password) { var passwordError = $('#passwordError'); console.log(data.text.password); passwordError.html('<i class="icon-error"></i><div class="error_note_wrapper">' + '<div class="error_note">' + '<span class="error_note_text">' + data.text.password + '</span></div></div>'); } if (data.text.passwordVerify) { var passwordVerify = $('#passwordVerifyError'); console.log(data.text.passwordVerify); passwordVerify.html('<i class="icon-error"></i><div class="error_note_wrapper">' + '<div class="error_note">' + '<span class="error_note_text">' + data.text.passwordVerify + '</span></div></div>'); } if (data.text.captcha) { var captcha = $('#captchaError'); console.log(data.text.captcha); captcha.html('<i class="icon-error"></i><div class="error_note_wrapper">' + '<div class="error_note">' + '<span class="error_note_text">' + data.text.captcha + '</span></div></div>'); } if (data.text.userType) { var user_type = $('#userTypeError'); console.log(data.text.userType); user_type.html('<i class="icon-error"></i><div class="error_note_wrapper">' + '<div class="error_note">' + '<span class="error_note_text">' + data.text.userType + '</span></div></div>'); } } else { $('.reg-success').html(data.text); var delay = 2000; window.location.href = url = window.location.href + "?reg=ok"; location.replace(url); setTimeout('window.location.reload(true);', delay); } } ).on('ajax:error', function (event, xhr, status, error) { } ); </script> <div class="popup" id="premium-pop"> </div> <link rel="stylesheet" href="/videouroki/res/lightslider/lightslider.min.css"> <link rel="stylesheet" href="/videouroki/res/perfectScrollbar/perfect-scrollbar.css"> <link rel="stylesheet" href="/videouroki/assets/font-awesome/css/font-awesome.min.css"> <link rel="stylesheet" href="/assets/vendor/fancybox/jquery.fancybox.min.css"> <script src="/videouroki/res/perfectScrollbar/perfect-scrollbar.jquery.min.js"></script> <script src="/js/rails.js"></script> <script src="/videouroki/res/lightslider/lightslider.min.js"></script> <script src="/videouroki/res/jquery.validate.min.js"></script> <script src="/videouroki/res/autosize-master/autosize.min.js"></script> <script src="/videouroki/js/tabs.js"></script> <script src="/videouroki/js/select.js"></script> <script src="/videouroki/js/global.js?2109"></script> <script src="/videouroki/js/views.js"></script> <script src="/videouroki/plugin/notify/notify.min.js"></script> <script src="/videouroki/plugin/notify/notify-metro.js"></script> <script src="/videouroki/js/lazyload.min.js"></script> <script src="/assets/vendor/fancybox/jquery.fancybox.min.js"></script> <script type="text/javascript"> $(document).ready( function () { // new LazyLoad(); } ) </script> <!--[if gte IE 9]><script type="text/javascript" src="/videouroki/assets/ckeditor-mini/ckeditor.js"></script><![endif]--> <script type="text/javascript" src="/videouroki/js/readmore.js"></script></body> </html>