Usando XML en el entorno Delphi. Usando el modelo de objetos de documento XML

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

Sin embargo, la opción ideal para almacenar la configuración del programa está estructurada XML archivos. Su ventaja es que es posible que el número de parámetros no sea fijo. Para entender mejor esto, veamos un ejemplo específico.

En el programa USearch, cuando hace clic en una entrada, aparece un menú contextual que muestra una lista de elementos. Estos elementos son comandos, que a su vez se cargan desde el archivo de configuración. Si la configuración se almacenó en INI archivo, entonces el programa podría guardar y cargar una cierta cantidad de comandos, por ejemplo 10 o 50. Tan pronto como se necesite un valor mayor, el código deberá reescribirse y recompilarse en consecuencia.


Usando el enfoque usando XML archivos, podremos cargar todos los parámetros de la sección dinámicamente. Además de todo esto, el archivo de configuración será más elegante, sin numeración redundante de parámetros. Sin embargo, medios estándar trabajar con XML Delphi tiene muchas desventajas, por lo que recomiendo usar la biblioteca estándar. MSXML. Suele venir incluido por defecto sistemas operativos Familia Windows.


Para conectar MSXML, necesitamos generar un archivo de interfaz con una lista de todas las funciones, importándolo desde el servidor COM. Se ha escrito bastante sobre cómo importar una interfaz. artículos detallados, te sugiero que descargues el archivo MSXML2_TLB.PAS ya 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í, todos los programas creados podrán utilizar el módulo. MSXML, sólo necesitas agregar la línea MSXML2_TLB a uses.

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

Procedimiento LoadData; var XMLDoc: DOMDocumento; 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 según la norma cualquier XML el archivo debe contener una etiqueta raíz (en este caso configuración), entonces necesitamos obtenerlo usando la función Elemento de documento. Luego se genera el contenido entre las etiquetas. , que a su vez se encuentran entre las etiquetas . Por lo tanto, desde el archivo settings.xml, nuestro método mostrará texto en el cuadro de mensaje. "100px".

500px 100px

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

A pesar de que el tema del trabajo con XML en Delphi se ha discutido ampliamente en Internet, a menudo surgen preguntas sobre este tema en varios foros.

También escribí sobre esto, pero me gustaría volver al caso real de un análisis rápido. archivo XML y extracción de datos que hice hoy en el trabajo. No me tomó más de 5 minutos obtener los datos necesarios.

Fondo. Hoy necesitábamos procesar datos sobre programas instalados en los ordenadores de los usuarios (sí, sí, detectamos piratas :)). El departamento técnico me proporcionó esta información, despojada de usuarios desprevenidos a través de la red mediante WMI. El programa que utilizaron produce informes en formato XML. En consecuencia, me trajeron una montaña de archivos XML con una estructura bastante compleja de la que sólo necesitaba extraer el nombre de los productos de software instalados.

Tratamiento . Después de revisar un par de archivos manualmente, me di cuenta de que no tardaría en envejecer y decidí escribir un pequeño convertidor. Después de iniciar Delphi, seleccioné el objeto XML DataBinding en el repositorio y le introduje uno de los archivos. Dejé todas las configuraciones y parámetros por defecto y como resultado creé un módulo con una gran cantidad de clases e interfaces para acceder a los elementos de este archivo XML. No dediqué mucho tiempo a descubrir la estructura de clases e inmediatamente pasé a escribir un convertidor.

En la nueva aplicación de consola escribí un código bastante simple:


programa XML2TXT;

usos
Formularios
Clases, SysUtils,
SoftwareXML en "SoftwareXML.pas";

procedimiento CovertXML2Text;
var
base blanda: IXMLSTDSoftwareType;
yo: entero;
Sr: TSearchRec;
CurDir: cadena;
Exportar archivo: TStringList;
comenzar
CurDir:= IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName));
si FindFirst(CurDir+"*.xml", faAnyFile, sr) = 0 entonces
repetir
ExportFile:= TStringList.Create;
basesoft:= LoadSTDSoftware(Pchar(CurDir+sr.Name));
para i:= 0 a softbase.InstalledSoftware.source.software.Count - 1 hacer
ExportFile.Add(softbase.InstalledSoftware.source.software[i].DisplayName);
ExportFile.Ordenar;
ExportFile.SaveToFile(CurDir + softbase.InstalledSoftware.Source.servername+".txt");
ExportFile.Free;
hasta FindNext(sr) 0;
fin;

comenzar
Aplicación.Inicializar;
Texto XML2 encubierto;
fin.

Como resultado, tuve un archivo de texto para cada computadora en la red, que contenía una lista del software instalado.

Siento que este código requiere alguna explicación. Por ejemplo, ¿por qué utilicé el módulo Formularios en una aplicación de consola y llamé al procedimiento Application.Initialize;

En realidad, es simple: es un pequeño truco que le permite utilizar el enlace de datos XML en una aplicación de consola. Porque se negó obstinadamente a inicializar la clase para trabajar con XML. Aún no he descubierto las verdaderas razones: hoy el tiempo era importante, ya pasé 4 de 5 minutos luchando contra este error. :) Creo que abordaré este problema más adelante y escribiré cuál es el verdadero motivo.

La extraña clase de base blanda fue creada en basado en XML file: ese era el nombre del elemento raíz, y softbase.InstalledSoftware.source.software[i].DisplayName: simplemente navegue a través de los elementos anidados hasta el deseado y obtenga su valor.

En realidad, así es como se ve uno de los más maneras rápidas trabajando con XML en Delphi.

XML se utiliza cada vez más para almacenar información e intercambiarla entre aplicaciones y sitios web. Muchas aplicaciones utilizan este lenguaje como lenguaje base para almacenar datos, mientras que otras lo utilizan para exportar e importar datos XML. Esto significa que es hora de que los desarrolladores piensen en cómo pueden utilizar datos XML en sus propias aplicaciones.

En este artículo veremos el modelo de objetos de documento (DOM) XML y su implementación por parte de Microsoft: Microsoft XML DOM.

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 a través de la estructura del documento XML.

Veamos los principales objetos XML DOM y demos 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 normalmente 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 objetos XML DOM: DOMDocument, XMLDocument, XMLHTTPRequest y varios otros implementados en la biblioteca MSXML.DLL. Se debe incluir una referencia al módulo MSXML_TLB en la lista de Usos.

dispositivo DOM XML

El modelo de objetos de documento representa un documento XML como una estructura de árbol que consta de ramas. Las interfaces de programación XML DOM permiten a las aplicaciones navegar por el árbol de documentos y manipular sus ramas. Cada rama puede tener un tipo específico (DOMNodeType), según el cual se determinan las ramas principal y secundaria. En la mayoría de los documentos XML encontrará ramas como elemento, atributo y texto. Los atributos son un tipo especial de rama y no son ramas secundarias. Los atributos se manipulan utilizando métodos especiales proporcionados por objetos XML DOM.

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

Documento XML de prueba

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

Imperio burlesco Bob Dylan EE.UU Columbia 10.90 1985 esconde tu corazón Bonnie Tylor Reino Unido Registros CBS 9.90 1988 ... Libera mi corazón Joe Cocker EE.UU EMI 8.20 1987

Ahora estamos listos para comenzar a observar el modelo de objetos XML DOM, que comenzaremos con el objeto XMLDOMDocument.

Documento XML: objeto XMLDOMDocument

Trabajar con un documento XML comienza con cargarlo. Para ello utilizamos el método Load, que tiene un solo parámetro que indica la URL del documento a cargar. 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, debe utilizar el método LoadXML para cargar el documento.

Para controlar cómo se carga el documento (síncrono o asíncrono), utilice la propiedad Async. De forma predeterminada, esta propiedad está establecida en Verdadero, 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 saber si el documento se ha cargado o no. También puede crear un controlador de eventos OnReadyStateChange que recibirá 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(Sender: TObject); var XMLDoc: IXMLDOMDocumento; comenzar XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Falso; XMLDoc.Load('C:\DATA\DATA.xml'); // // Aquí está el código que manipula // el documento XML y sus ramas // XMLDoc:= Nil; fin;

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

Manejo de errores

De particular interés son las propiedades asociadas con el procesamiento del documento cuando se carga. Por tanto, la propiedad ParseError devuelve un objeto XMLDOMParseError que contiene información sobre un error ocurrido durante el procesamiento del 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 // De lo contrario Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Nulo;

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

Imperio burlesco Bob Dylan EE.UU Columbia 10.90 1985

quitando el elemento de cierre en la segunda línea:</p><p> <CD> <TITLE>Imperio burlesco <ARTIST>Bob Dylan</ARTIST> <COUNTRY>EE.UU</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>Ahora escribamos código que devuelva los valores de las propiedades del objeto XMLDOMParseError:</p><p>XMLError:= XMLDoc.ParseError; Si XMLError.ErrorCode<>0 Luego, con XMLError, Memo1.Lines comienza Add('Archivo: ' + URL); Add('Código: ' + IntToStr(Código de error)); Agregar ('Error:' + Razón); Agregar ('Texto:' + TextoSrc); Add('Línea: ' + IntToStr(Línea)); Agregar('Posición:' + IntToStr(LinePos)); fin si no Memo1.Lines.Add(XMLDoc.XML); Fin;</p><p>y ejecutemos nuestra aplicación. Como resultado, recibimos la siguiente información de 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 el motivo de su aparición.</p> <p>Ahora restauremos el elemento de cierre. <TITLE>en nuestro documento y continuar nuestra discusión sobre XML DOM.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Accediendo al árbol de documentos</h2> <p>Para acceder a un árbol de documentos, puede obtener el elemento raíz y luego recorrer 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 utilizar la propiedad DocumentElement para obtener el contenido de cada elemento secundario:</p><p>Nodo Var: IXMLDOMNode; Raíz: IXMLDOMElement; I: Entero; ... Raíz:= XMLDoc.DocumentElement; Para I:= 0 a Root.ChildNodes.Length-1, comience Nodo:= Root.ChildNodes.Item[I]; Memo1.Lines.Add(Nodo.Texto); Fin;</p><p>Para nuestro documento XML obtendremos el siguiente texto.</p> <p>Si estamos interesados ​​en una rama específica o en 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 definido 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 especificar 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, comience Node:= Nodes.Item[I]; Memo1.Lines.Add(Nodo.Texto); 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 de documentos. 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>Un 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 la 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, normalmente se utiliza la propiedad NodeValue (disponible para atributos, ramas de texto, comentarios, instrucciones de procesamiento y secciones CDATA), la propiedad Text, que devuelve el contenido de texto de la rama, o la propiedad NodeTypedValue. . Este último, sin embargo, sólo se puede utilizar para ramas con elementos tipificados.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Navegando por el árbol de documentos</h3> <p>El objeto XMLDOMNode proporciona muchas formas de navegar por el árbol de documentos. Por ejemplo, para acceder a la rama principal se utiliza la propiedad ParentNode (tipo XMLDOMNode), a las ramas secundarias se accede a través de las propiedades ChildNodes (tipo XMLDOMNodeList), FirstChild y LastChild (tipo XMLDOMNode), etc. La propiedad OwnerDocument devuelve un objeto de tipo XMLDOMDocument que identifica el propio documento XML. Las propiedades enumeradas anteriormente le permiten navegar fácilmente por el árbol de documentos.</p> <p>Ahora repasemos todas las ramas del documento XML:</p><p>Raíz:= XMLDoc.DocumentElement; Para I:= 0 a Root.ChildNodes.Length-1, comience el nodo:= Root.ChildNodes.Item[I]; Si Node.HasChildNodes Entonces 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 de documentos. Además, existe un método SelectSingleNode que devuelve solo la primera rama del documento. Ambos métodos le permiten especificar plantillas XSL para buscar ramas.</p> <p>Repasemos el proceso de uso del método SelectNodes para recuperar todas las ramas que tienen una rama CD y una subrama PRICE:</p><p>Raíz:= XMLDoc.DocumentElement; Nodos:= Root.SelectNodes('CD/PRECIO');</p><p>Todas las subramas PRICE de la rama CD se colocarán en la colección Nodes. Volveremos a la discusión sobre las plantillas XSL un poco más adelante.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Manipulación de ramas secundarias</h3> <p>Para manipular ramas secundarias, podemos usar los métodos del objeto XMLDOMNode (Tabla 2).</p> <p>Para eliminar completamente la entrada del primer disco, debe ejecutar el siguiente código:</p><p>Var XMLDoc: IXMLDOMDocumento; Raíz: IXMLDOMNode; Nodo: IXMLDOMNodo; 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: IXMLDOMDocumento; Raíz: IXMLDOMNode; Nodo: IXMLDOMNodo; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Falso; 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 NuevoNodo: IXMLDOMNodo; Hijo: IXMLDOMNode; ... // Crea una nueva rama - NuevoNodo:= XMLDoc.CreateNode(1, 'CD', ''); // Agrega un elemento Niño:= XMLDoc.CreateNode(1,'TÍTULO',''); // Agrega un elemento NewNode.AppendChild(Child); // Y establece su valor Child.Text:= 'Pink Floyd'; // Agrega un elemento <ARTIST>Niño:= XMLDoc.CreateNode(1, 'ARTISTA', ''); // Agrega un elemento NewNode.AppendChild(Child); // Y establece su valor Child.Text:= 'Division Bell'; // Agrega un elemento <COUNTRY>Niño:= XMLDoc.CreateNode(1, 'PAÍS', ''); // Agrega un elemento NewNode.AppendChild(Child); // Y establece su valor Child.Text:= 'UK'; // Agrega un elemento <COMPANY>Niño:= XMLDoc.CreateNode(1, 'EMPRESA', ''); // Agrega un elemento NewNode.AppendChild(Child); // Y establece su valor Child.Text:= 'EMI Records Ltd.'; // Agrega un elemento <PRICE>Niño:= XMLDoc.CreateNode(1, 'PRECIO', ''); // Agrega un elemento NewNode.AppendChild(Child); // Y establece su valor Child.Text:= '11.99"; // Agrega un elemento <YEAR>Niño:= XMLDoc.CreateNode(1, 'AÑO', ''); // Agrega un elemento NewNode.AppendChild(Child); // Y establece su valor Child.Text:= '1994'; // Y agrega una rama Root.AppendChild(NewNode); ...</p><p>El código anterior muestra la siguiente secuencia de pasos para agregar una nueva rama:</p> <ul><li>Creando una nueva rama usando el método CreateNode: <ul><li>crear 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 del elemento mediante la propiedad Texto;</li> <li>...repetir para todos los elementos.</li> </ul></li> <li>Agregar una nueva rama a un 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 una ubicación específica del árbol, debe utilizar 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 utilizando los métodos SelectNodes o GetElementsByTagName, u obtenerse de la propiedad ChildNodes.</p> <p>Ya vimos el uso de este objeto en el ejemplo dado en la sección "Navegación por el árbol de documentos". Aquí presentamos algunas observaciones teóricas.</p> <p>El número de ramas de la lista se puede obtener como el valor de la propiedad Longitud. Las ramas tienen índices de 0 a Longitud-1, y se puede acceder a cada rama individual a través del elemento de matriz Item con el índice correspondiente.</p> <p>También se puede navegar a través de una 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>Crear y guardar documentos</h2> <p>Hasta ahora hemos visto cómo agregar ramas y elementos a documentos XML existentes. Ahora creemos un documento XML sobre la marcha. En primer lugar, permítanos recordarle que un documento se puede cargar no solo desde una URL, sino también desde una cadena normal. A continuación se muestra cómo crear un elemento raíz, que luego se puede usar para construir dinámicamente otros elementos (que ya cubrimos en la sección Manipulación de ramas secundarias):</p><p>Var XMLDoc: IXMLDOMDocumento; Raíz: IXMLDOMNode; Nodo: IXMLDOMNodo; S: cadena ancha; ...S:=' <CATALOG></CATALOG>'; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Falso; 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 construir el documento XML, lo guardaremos en un archivo usando 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 el documento XML en un nuevo objeto XMLDOMDocument. En este caso, el documento se procesa por completo y, como resultado, se comprueba su estructura y sintaxis. A continuación se muestra cómo guardar un documento en otro objeto:</p><p>Procedimiento TForm1.Button2Click(Remitente: TObject); var XMLDoc2: IXMLDOMDocumento; comenzar XMLDoc2:= CoDOMDocument.Create; XMLDoc.Guardar(XMLDoc2); Memo2.Lines.Add(XMLDoc2.XML); ... XMLDoc2:= Nulo; fin;</p><p>Finalmente, tenga en cuenta que el método Save también le permite guardar un documento XML en otros objetos COM que admitan 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>Cuando analizamos el método SelectNodes del objeto XMLDOMNode, mencionamos que proporciona una forma más flexible de acceder a las ramas de documentos. La flexibilidad radica en el hecho de que puede especificar una plantilla XSL como criterio para seleccionar ramas. Estas plantillas proporcionan un poderoso mecanismo para buscar información en documentos XML. Por ejemplo, para obtener una lista de todos los títulos de CD-ROM de música de nuestro catálogo, puede ejecutar la siguiente consulta:</p><p>Para saber qué discos de artistas fueron lanzados en EE. UU., la solicitud se forma de la siguiente manera:</p><p>Nodos:= Root.SelectNodes('CD/ARTISTA');</p><p>A continuación se muestra cómo encontrar la primera unidad en el directorio:</p><p>Nodos:= Root.SelectNodes('CD/TÍTULO');</p><p>Y última:</p><p>Nodos:= Root.SelectNodes('CD/TÍTULO');</p><p>Para buscar CD de Bob Dylan, puede ejecutar la siguiente consulta:</p><p>Nodos:= Root.SelectNodes('CD[$cualquier$ ARTISTA= "Bob Dylan"]/TÍTULO');</p><p>y para obtener una lista de discos lanzados después de 1985, ejecutamos la siguiente consulta:</p><p>Nodos:= Root.SelectNodes('CD/TÍTULO');</p><p>Una discusión más detallada sobre la sintaxis XSL requiere una publicación separada. Para intrigar a los lectores y fomentar futuras investigaciones, daré sólo un pequeño ejemplo de posibles usos de XSL. Digamos que necesitamos convertir nuestro catálogo en una tabla HTML normal. Usando métodos tradicionales, debemos recorrer todas las ramas del árbol y formar las etiquetas adecuadas para cada elemento recibido. <TD>…</TD>.</p> <p>Usando XSL simplemente creamos una plantilla (u hoja de estilos) en la que indicamos qué se necesita convertir y cómo. Luego superponemos esta plantilla en nuestro directorio y listo: tenemos el texto de una plantilla XSL que convierte el directorio en una tabla (Listado 2).</p> <p>El código para superponer la 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:= Nulo; fin;</p><p>Para concluir nuestra discusión sobre XSL, cabe decir que actualmente este lenguaje se utiliza 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 revisar todos los objetos DOM XML de Microsoft y proporcionar ejemplos de su uso en un solo artículo. Aquí sólo hemos tocado las cuestiones básicas del uso de XML DOM en aplicaciones. En mesa</p> <p>La Figura 3 muestra todos los objetos implementados en Microsoft XML DOM.</p> <p>A pesar de que el tema del trabajo con XML en Delphi se ha discutido ampliamente en Internet, a menudo surgen preguntas sobre este tema en varios foros. <br></p><p>Ya escribí también, pero me gustaría volver al caso real de analizar rápidamente un archivo XML y extraer datos, lo que hice hoy en el trabajo. No me tomó más de 5 minutos obtener los datos necesarios. <br></p><p>Fondo. Hoy necesitábamos procesar datos sobre programas instalados en las computadoras de los usuarios (sí, sí, detectamos piratas :)). El departamento técnico me proporcionó esta información, despojada de usuarios desprevenidos a través de la red mediante WMI. El programa que utilizaron produce informes en formato XML. En consecuencia, me trajeron una montaña de archivos XML con una estructura bastante compleja de la que sólo necesitaba extraer el nombre de los productos de software instalados. <br><span><br><p>Tratamiento . Después de revisar un par de archivos manualmente, me di cuenta de que no tardaría en envejecer y decidí escribir un pequeño convertidor. Después de iniciar Delphi, seleccioné el objeto XML DataBinding en el repositorio y le introduje uno de los archivos. Dejé todas las configuraciones y parámetros por defecto y como resultado creé un módulo con una gran cantidad de clases e interfaces para acceder a los elementos de este archivo XML. No dediqué mucho tiempo a descubrir la estructura de clases e inmediatamente pasé a escribir un convertidor. <br></p><p>En la nueva aplicación de consola escribí un código bastante simple: <br></p> <br>programa XML2TXT;</p><p>usos <br>Formularios <br>Clases, SysUtils, <br>SoftwareXML en "SoftwareXML.pas";</p><p>procedimiento CovertXML2Text; <br>var <br>base blanda: IXMLSTDSoftwareType; <br>yo: entero; <br>Sr: TSearchRec; <br>CurDir: cadena; <br>Exportar archivo: TStringList; <br>comenzar <br>CurDir:= IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)); <br>si FindFirst(CurDir+"*.xml", faAnyFile, sr) = 0 entonces <br>repetir <br>ExportFile:= TStringList.Create; <br>basesoft:= LoadSTDSoftware(Pchar(CurDir+sr.Name)); <br>para i:= 0 a softbase.InstalledSoftware.source.software.Count - 1 hacer <br>ExportFile.Add(softbase.InstalledSoftware.source.software[i].DisplayName); <br>ExportFile.Ordenar; <br>ExportFile.SaveToFile(CurDir + softbase.InstalledSoftware.Source.servername+".txt"); <br>ExportFile.Free; <br>hasta FindNext(sr) 0; <br>fin;</p><p>comenzar <br>Aplicación.Inicializar; <br>Texto XML2 encubierto; <br>fin. <br></p><p>Como resultado, tuve un archivo de texto para cada computadora en la red, que contenía una lista del software instalado. <br></p><p>Siento que este código requiere alguna explicación. Por ejemplo, ¿por qué utilicé el módulo Formularios en una aplicación de consola y llamé al procedimiento Application.Initialize; <br></p><p>En realidad, es simple: es un pequeño truco que le permite utilizar el enlace de datos XML en una aplicación de consola. Porque se negó obstinadamente a inicializar la clase para trabajar con XML. Aún no he descubierto las verdaderas razones: hoy el tiempo era importante, ya pasé 4 de 5 minutos luchando contra este error. :) Creo que abordaré este problema más adelante y escribiré cuál es el verdadero motivo. <br></p><p>La extraña clase softbase se creó basándose en un archivo XML (ese era el nombre del elemento raíz, y softbase.InstalledSoftware.source.software[i].DisplayName) simplemente navegue a través de los elementos anidados hasta el deseado y obtenga su valor. <br></p><p>En realidad, así es como se ve una de las formas más rápidas de trabajar con XML en Delphi. <br></p> <p>Recientemente, se ha prestado mucha atención a la creación de sistemas de comercio electrónico, o como también se les llama, B2B (de empresa a empresa). Teniendo en cuenta las recomendaciones para la construcción de sistemas de transmisión de intercambio del organismo que coordina las tecnologías de Internet - Consorcio WWW: se hace hincapié en las tecnologías XML y la construcción de sistemas de intercambio de documentos XML.</p> <p>La ventaja de utilizar XML en los negocios electrónicos es la alta eficiencia de los sistemas B2B a bajos costos de creación debido a una presentación clara y visual de información estructurada, la capacidad de utilizar protocolos de red modernos y crear sistemas comerciales en tiempo real.</p> <p>La independencia de presentar información en forma de documentos XML permite que diferentes empresas que participan en el comercio electrónico produzcan software de forma independiente entre sí.</p> <p>En todos los sistemas, el intercambio generalmente se construye según 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).</p> <p>Una de las opciones posibles para procesar mensajes XML es crear aplicaciones BIN/CGI (ISAPI) o componentes COM (servidor) que generen o procesen documentos XML.</p> <p>Por un lado, la aplicación actúa como un cliente que emite una solicitud HTTP en modo POST, por otro lado, existe un servidor WEB de cuyo lado se procesa la solicitud y se emite la respuesta. Los documentos XML se utilizan en el intercambio de información.</p> <p>Una de las opciones de implementación más efectivas es utilizar un analizador XML existente que admita el modelo DOM. Este analizador es un paquete de distribución de Win`98 o un componente de IE 4.7 y superior (para Win`95) y representa un servidor COM ubicado en la biblioteca msxml.dll.</p> <p>Modelo de objetos componentes (COM): representa datos y métodos encapsulados en una sola entidad y una forma de acceder a ellos a través de un sistema de interfaces. Usando 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 de un sistema de interfaces. La descripción de interfaces se realiza mediante el lenguaje de definición de interfaz (IDL), que se puede realizar automáticamente utilizando el entorno.</p> <p>Importación de herramientas Delphi desde un servidor COM <i>msxml.dll</i>, Se crean archivos de descripción de interfaz IDL y un archivo de descripción binaria de tipos de biblioteca (TLB). Esta operación se realiza a través del menú del sistema: <b>Proyecto | Importación de biblioteca de tipos:</b>(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 <b>Crear unidad</b>). Utilizando el archivo TLB, el entorno genera un archivo de descripción del servidor COM "Pascal": MSXML_TLB.pas</p> <p>El archivo MSXML_TLB.pas describe todas las interfaces, constantes y coclases del servidor COM.</p> <p>Para acceder a los objetos del elemento COM, es necesario en la directiva <b>USOS</b> 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 el elemento del campo de texto Memo1.</p> <b>usos</b> Windows, Mensajes, SysUtils, Clases, Gráficos, Controles, Formularios, Diálogos, OleServer, MSXML_TLB, StdCtrls; <b>tipo</b> TForm1 = <b>clase</b>(TForm)Botón1: TBotón; Memo1: TMemo; <b>procedimiento</b> Botón1Clic(Remitente: TObject); <b>fin;</b> <b>var</b> Formulario1: TForm1; <b>implementación</b>($R *.DFM) <b>Procedimiento</b> TForm1.Button1Click (Remitente: Tobject); <span>// declaración de una coclase del objeto DOMDocument;</span> <b>var</b> coDoc: CoDOMDocumento; <span>// clase consistente con la interfaz IDOMDocument;</span> <b>var</b> Documento: IXMLDOMDocumento; <b>comenzar</b> <span>// creando una instancia de un objeto DOMDocument;</span> Doc:= coDoc.Create; <span>// llamando al método Load de una instancia de objeto DOMDocument;</span> Doc.load("datos.xml"); <span>// acceso a la propiedad xml de la instancia del objeto DOMDocument;</span> Memo1.Texto:=Doc.xml; <b>fin;</b> <b>fin.</b> <h2>Concepto de DOM - Modelo de objetos de documento</h2> <p>Cada documento XML se representa como un conjunto de muchos objetos (clases), con cuya ayuda es posible acceder a elementos individuales (campos de objetos). DOM: la interfaz describe el acceso tanto a objetos simples del tipo DOMString o CharacterData como a partes o elementos individuales de un documento XML: DOMFragmentElement, DOMNode, DOMElement.</p> <p>A continuación se muestran las propiedades y métodos más importantes de los objetos XMLDOMNode, XMLDOMNode, XMLDOMNodeList. Cabe señalar que los métodos y funciones de los objetos DOM (Document Object Model) que se presentan a continuación son utilizados por el analizador XML de Microsoft msxml.dll y son algo más amplios que el modelo DOM aprobado por el Consorcio W3C.</p> <p>Puede encontrar una descripción más completa de la interfaz del objeto DOM en</p> <table cellspacing="0" cellpadding="4" width="500" border="1"><tbody><tr><td valign="top" colspan="2">Objeto XMLDOMDocument</td> </tr><tr><td valign="top" colspan="2">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 en él, etc. .</td> </tr><tr><td valign="top" colspan="2"><b>Propiedades</b> </td> </tr><tr><td valign="top" width="39%"><b>asíncrono</b> </td> <td valign="top" width="61%">Propiedad que identifica el modo de procesamiento actual</td> </tr><tr><td valign="top" width="39%" height="19"><b>Error de análisis</b> </td> <td valign="top" width="61%" height="19">Devuelve una referencia al objeto de manejo de errores XMLDOMParseError.</td> </tr><tr><td valign="top" width="39%"><b>Habilitar: deshabilita la verificación de documentos.</b> </td> <td> </td> </tr><tr><td valign="top" width="39%"><b>URL</b> </td> <td valign="top" width="61%">Devuelve la URL del documento.</td> </tr><tr><td valign="top" width="39%"><b>elementodocumento</b> </td> <td valign="top" width="61%">Contiene una referencia al elemento raíz del documento como un objeto XMLDOMElement.</td> </tr><tr><td valign="top" colspan="2"><b>Métodos</b> </td> </tr><tr><td valign="top" width="39%"><b>cargar(url) <br>cargarXML(cadenaxml)</b> </td> <td valign="top" width="61%">Carga un documento XML,</td> </tr><tr><td valign="top" width="39%"><b>guardar(objetivo)</b> </td> <td valign="top" width="61%">Guarda un documento XML en un archivo</td> </tr><tr><td valign="top" width="39%"><b>aborto</b> </td> <td valign="top" width="61%">Interrumpir el proceso de carga y procesamiento de documentos.</td> </tr><tr><td valign="top" width="39%"><b>crearAtributo(nombre)</b> </td> <td valign="top" width="61%">Crea un nuevo atributo con el nombre especificado para el elemento actual.</td> </tr><tr><td valign="top" width="39%"><b>crearNodo(Tipo, nombre, nombreEspacioURI)</b> </td> <td valign="top" width="61%">Crea un nodo del tipo y nombre especificados.</td> </tr><tr><td valign="top" width="39%"><b>crearElemento(nombre de etiqueta)</b> </td> <td valign="top" width="61%">Crea un elemento de documento con el nombre especificado.</td> </tr><tr><td valign="top" width="39%"><b>crearTextNode(datos)</b> </td> <td valign="top" width="61%">Crea texto dentro de un documento.</td> </tr><tr><td valign="top" width="39%"><b>getElementsByTagName(nombre de etiqueta)</b> </td> <td valign="top" width="61%">Devuelve una referencia a una colección de elementos del documento con el nombre dado</td> </tr><tr><td valign="top" width="39%"><b>nodoFromID(idString)</b> </td> <td valign="top" width="61%">Buscando un elemento por ID</td> </tr></tbody></table><br><table cellspacing="0" cellpadding="4" width="500" border="1"><tbody><tr><td valign="top" colspan="2"> <b>Objeto XMLDOMNodo</b> </td> </tr><tr><td valign="top" colspan="2">Un objeto XMLDOMNode que implementa la interfaz DOM básica <b>Nodo</b>, está destinado a manipular un solo nodo del árbol de documentos. 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.</td> </tr><tr><td valign="top" colspan="2"><b>Propiedades</b> </td> </tr><tr><td valign="top" width=" "><b>nombre de nodo, nombre de base</b> </td> <td valign="top" width="65%">Devuelve el nombre del nodo actual.</td> </tr><tr><td valign="top" width="35%"><b>prefijo</b> </td> <td valign="top" width="65%">Devuelve el prefijo del espacio de nombres.</td> </tr><tr><td valign="top" width="35%"><b>tipo de datos</b> </td> <td valign="top" width="65%">Determina el tipo de contenido del nodo actual.</td> </tr><tr><td valign="top" width="35%"><b>tipo de nodo, cadena de tipo de nodo</b> </td> <td valign="top" width="65%">Devuelve el tipo del nodo actual:</td> </tr><tr><td valign="top" width="35%"><b>atributos</b> </td> <td valign="top" width="65%">Devuelve una lista de atributos del nodo actual como una colección de XMLDOMNamedNodeMap.</td> </tr><tr><td valign="top" width="35%"><b>texto</b> </td> <td valign="top" width="65%">Devuelve el contenido del subárbol actual como texto.</td> </tr><tr><td valign="top" width="35%"><b>XML</b> </td> <td valign="top" width="65%">Devuelve una representación XML del subárbol actual.</td> </tr><tr><td valign="top" width="35%"><b>valornodo</b> </td> <td valign="top" width="65%">Devuelve el contenido del nodo actual.</td> </tr><tr><td valign="top" width="35%"><b>niñoNodos</b> </td> <td valign="top" width="65%">Devuelve una lista de elementos secundarios como XMLDOMNodeList.</td> </tr><tr><td valign="top" width="35%"><b>primer hijo, último hijo</b> </td> <td valign="top" width="65%">Devuelve el primer/último elemento hijo</td> </tr><tr><td valign="top" width="35%"><b>anteriorHermano,siguienteHermano</b> </td> <td valign="top" width="65%">Devuelve el elemento hermano anterior/siguiente.</td> </tr><tr><td valign="top" width="35%"><b>nodopadre</b> </td> <td valign="top" width="65%">Contiene un enlace al elemento principal.</td> </tr><tr><td valign="top" width="35%"><b>propietarioDocumento</b> </td> <td valign="top" width="65%">Devuelve un puntero al documento en el que se encuentra el nodo actual.</td> </tr><tr><td valign="top" colspan="2"><b>Métodos</b> </td> </tr><tr><td valign="top" width="35%"><b>agregarNiño(niñonuevo)</b> </td> <td valign="top" width="65%">Agrega un nuevo elemento secundario al nodo actual.</td> </tr><tr><td valign="top" width="35%"><b>insertarAntes(nuevoNiño, refNiño)</b> </td> <td valign="top" width="65%">Inserta un nodo secundario, posicionándolo en el subárbol actual "a la izquierda" del nodo especificado por el parámetro refChild.</td> </tr><tr><td valign="top" width="35%"><b>clonNodo(profundo)</b> </td> <td valign="top" width="65%">Crea una copia del elemento actual.</td> </tr><tr><td valign="top" width="35%"><b>obtener atributo</b><b>(nombre) <br> </b><b>obtenerNodoAtributo</b><b><span>(nombre) <br>establecerAtributo(nombre,valor) <br>setAttributeNode(XMLDOMAttribute)</span> </b> </td> <td valign="top" width="65%">Acceso a los atributos (crear, leer, escribir) de un objeto. Nombre es el nombre del atributo, valor es su valor. Devuelve el valor de un objeto XMLDOMAttribute.</td> </tr><tr><td valign="top" width="35%"><b>reemplazarNiño(niñonuevo,niñoviejo) removeNiño(niñoviejo)</b> </td> <td valign="top" width="65%">Reemplaza el objeto oldChild de la lista actual de objetos secundarios con newChild. Eliminando el objeto oldChild</td> </tr><tr><td valign="top" width="35%"><b>selectNodes(patrónString) selectSingleNode(patrónString)</b> </td> <td valign="top" width="65%">Devuelve el objeto XMLDOMNodeList seleccionado por el patrón de búsqueda o el primer nodo</td> </tr><tr><td valign="top" width="35%"><b>transformarNodo(hoja de estilo) <br>transformNodeToObject(hoja de estilo,outputObject)</b> </td> <td valign="top" width="65%">Asigna una hoja de estilo al subárbol del nodo actual y devuelve una cadena, el resultado del procesamiento. Se pasa como parámetro una referencia al objeto DOMDocument que contiene instrucciones XSL.</td> </tr></tbody></table><br><h2>Uso de XML en los negocios.</h2> <p>Para tener una idea más clara, se necesita una explicación de por qué es necesario todo esto para entender cómo funciona:</p> <p>Al construir un sistema ERP corporativo o B2B, al organizar el intercambio de información de documentos XML entre empresas o sucursales de una empresa, se utiliza un sistema de transferencia de información eficaz y probado basado en servidores WEB existentes a través de protocolos HTTP.</p> <p>Por un lado, la aplicación actúa como un cliente, que emite una solicitud HTTP en modo POST, por otro lado, hay un servidor WEB, de cuyo lado se procesa la solicitud y se emite la respuesta; Los documentos XML se utilizan como intercambio.</p> <p>Por ejemplo, en un sistema ERP corporativo simple, un programa de contabilidad (ASU Bukhuchet) necesita generar una determinada solicitud para emitir una factura y transferirla a una sucursal que tiene un almacén (ASU Warehouse). AWP Una formulación similar del problema al crear un sistema B2B, cuando la Empresa A solicita la disponibilidad de productos (realiza una orden de compra) al Proveedor B.</p> <p>La empresa A y su programa actúan como cliente. El almacén lo mantiene el proveedor B, que tiene un complejo de base de datos de almacén en un servidor SQL. El intercambio se realiza a través del servidor WEB corporativo del Proveedor B.</p> <p>A continuación se presenta el siguiente algoritmo de intercambio típico:</p> <br>Figura 3. <ol><li><b>Empresa A</b> inicia <b>proceso A</b>(pedido de producto), que actúa como cliente WEB.</li><li><b>Proceso A</b> genera un documento XML (por ejemplo, una solicitud de factura) y lo transmite como una solicitud POST http al servidor WEB del Proveedor B. El identificador de recurso de la aplicación de procesamiento se utiliza como URI. La URI puede ser la misma para todo tipo de documentos o individual para cada tipo. Todo depende de la estructura del servidor B2B (WEB).</li><li>El servidor WEB analiza la solicitud y genera un servidor. <b>Proceso B</b>, pasando el cuerpo del documento XML como parámetro. <br>El servidor WEB inicia el proceso B y lo procesa como una página ASP, una aplicación CGI (ISAPI) o un serverlet JAVA (aplicación de servidor).</li><li><b>Proceso B</b>- genera una solicitud al servidor de base de datos SQL.</li><li>El servidor SQL realiza las operaciones necesarias en la base de datos, genera una respuesta y la devuelve <b>Proceso B</b>.</li><li>Basado en la respuesta del servidor SQL. <b>Proceso B</b> genera un documento XML (respuesta) y lo devuelve como respuesta a una solicitud http a la aplicación cliente.</li><li>A continuación, dependiendo de la situación del lado del cliente, se genera una nueva solicitud http o finaliza la sesión.</li> </ol><h2>Algunas palabras sobre la organización del flujo de documentos.</h2> <p>La regla general para desarrollar un sistema de intercambio de documentos XML es:</p><ul><li><b>En primer lugar</b>- desarrollo de un diagrama de flujo de documentos electrónicos y su estructura;</li><li><b>En segundo lugar</b>- desarrollo de tablas de funciones de proceso (subprocesos), es decir qué función en relación con qué documento XML implementará cada proceso.</li> </ul><p>Cada documento XML, al igual que un documento HTML, debe constar de un encabezado de mensaje (información encerrada en etiquetas) y un cuerpo de mensaje (para una solicitud, esta información está encerrada en etiquetas para responder a la solicitud). Para que el documento XML tenga la forma correcta, es necesario encuadrar sus dos componentes, “Encabezado” y “Solicitud”, con etiquetas, por ejemplo. El tipo de documento estándar se presenta a continuación:</p> <p>El encabezado (Figura 4), a diferencia de un documento HTML, debe contener varios tipos de información de servicio, incluida información sobre el tipo de documento que se transmite y el proceso de su procesamiento. El cuerpo del documento ingresa al procesamiento de información, es decir. Contenido enmarcado con etiquetas. Cabe señalar que la estructura de los títulos debe ser la misma para todo tipo de documentos.</p> <p>Para un proceso iniciado por el servidor, el algoritmo de procesamiento se construye preferiblemente (pero no necesariamente) de la siguiente manera:</p> <img src='https://i0.wp.com/codenet.ru/np-includes/upload/2005/01/05/128666.jpg' height="500" width="408" loading=lazy loading=lazy><br>Figura 6. <h2>Algunos puntos fundamentales a la hora de crear la parte cliente</h2> <p>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 parte del texto Delphi del programa para crear un encabezado de mensaje xml.</p> <b>procedimiento</b> TThread1.HeaderCreate(Remitente: Objeto); <b>var</b> <span>// declaración de una coclase, necesaria para crear</span> coDoc: CoDomDocument; <span>// objeto XMLDomDocument</span> Documento: DomDocument; r: IXMLDOMElemento; Nodo: IXMLDOMElement; // texto DOMText: IXMLDOMText; // atributo DOMAttribute: IXMLDOMAttribute; <b>comenzar</b> <span>// creando un documento DOM</span> Doc:=coDoc.Create; Doc.Set_async (falso); <span>// iniciación inicial del documento DOM</span> Doc.LoadXML(" <Header/>"); <span>// creando DOMElement (etiqueta<<b>Remitente</b>>) </span> Nodo:= Doc.createElement("Remitente"); <span>// crea un nodo de texto " <b>LLC "Tifón"</b>" </span> txt:= Doc.createTextNode("Typhoon LLC"); <span>// asignación al nodo<<b>Remitente</b>> valor</span> <span>// nodo de texto " <b>LLC "Tifón"</b>" </span> Nodo.appendChild(txt); <span>// agregando un elemento<<b>Remitente</b>> a la raíz del documento como hijo</span> r.appendChild(Nodo); <span> <<b>De</b>> </span> Nodo:= Doc.createElement("De"); txt:= Doc.createTextNode("http://tayfun.ru/xml/default.asp"); Nodo.appendChild(txt); r.appendChild(Nodo); <span>// operaciones similares para etiqueta<<b>A</b>> </span> Nodo:= Doc.createElement("Para"); txt:= Doc.createTextNode("http://irbis.ru"); Nodo.appendChild(txt); r.appendChild(Nodo); <span>// crear elemento DOME()</span> Nodo:= Doc.createElement("TypeDocument"); <span>// creando un nodo XMLDOMAttribute</span> Att:= Doc.createAttribute("Id", "Pedido"); <span> // <TypeDocument Id="Order"/> </span> Nodo.appendChild(Att); r.appendChild(Nodo); <b>fin;</b> <p>Cabe señalar que la declaración de la variable coDoc: CoDomDocument y Doc: DomDocument , así como su creación mediante el método Create (Doc:=coDoc.Create;) se realiza una vez. La declaración de variable se encuentra en la sección de declaración de variable global y no en el procedimiento local, como se demostró para mayor claridad en este ejemplo (es decir, una variable global de tipo DomDocument por módulo de programa).</p> <p>El resultado del programa anterior será el encabezado creado, en relación con nuestro documento xml de ejemplo: que se muestra en la Figura 5.</p> <img src='https://i2.wp.com/codenet.ru/np-includes/upload/2005/01/05/128662.gif' height="116" width="298" loading=lazy loading=lazy><br>Figura 5. <p><img src='https://i1.wp.com/codenet.ru/np-includes/upload/2005/01/05/128664.gif' height="179" width="385" loading=lazy loading=lazy><br>Figura 6.</p><p>La principal ventaja de transmitir información en forma de documentos XML es que es posible generar un mensaje utilizando estructuras de tablas independientes en el DBMS tanto en el lado receptor como en el transmisor. Usando nuestro ejemplo, digamos que necesita transferir información sobre las facturas de la Empresa A desde un DBMS que tiene la estructura que se muestra en la Figura 6.</p> <p>Para generar un documento xml que contiene una factura, inicialmente se crea una consulta SQL (consulta A) con información sobre la factura misma:</p> <b>SELECCIONAR</b>* DE Factura_General <b>DÓNDE</b> NúmFactura = :núm <b>SELECCIONAR</b> Bienes,calidad,precio, HZ_cod <b>DE</b> Bienes <b>DÓNDE</b> NúmFactura = :núm <span>// :num - parámetro que especifica el número de factura.</span> <p>A continuación se muestra parte del programa que forma el cuerpo del documento xml:</p> <b>procedimiento</b> TThread1.DataBodyCreate(Remitente: Objeto); <b>var</b> <span>// declaración de una coclase y un objeto XMLDomDocument</span>//coDoc: CoDomDocumento; <span>// debe ser global para todo el módulo.</span>//Documento: DomDocument; <span>// declaración de objetos DOMElement</span> r: IXMLDOMElemento; // Elemento DOME; Nodo, Nodo2: IXMLDOMElement; Nodo3, Nodo4: IXMLDOMElement; // texto DOMText: IXMLDOMText; cadena: cadena; <span>// Número de factura: <b>entero;</b>- variable global - // tiene el valor 987654 // consultaA, consultaB: <b>Cadena;</b>- variable global, // tiene un valor correspondiente a la solicitud // consultaA - solicita A información general sobre la factura // consultaB - solicita B información sobre los bienes descritos en // la factura (ver texto)</span> <b>comenzar</b> Consulta.Cerrar; <span>// ver el texto "consulta A"</span> Consulta.Texto:= consultaA; <span>// ejecuta la solicitud</span> Consulta.ExecSQL; Consulta.Abrir; <span>//obteniendo la dirección del elemento raíz</span> r:=Doc.Get_documentElement; Nodo2:= Doc.createElement("Solicitud"); <span>// crear DOMElement (etiqueta)</span> Nodo:= Doc.createElement("Factura"); <span>// agregando un elemento a la raíz</span> r.appendChild(Nodo2); <span>// agregando un elemento a</span> Nodo2. appendChild(Nodo); <span>// crear DOMElement (etiqueta)</span> Nodo3:= Doc.createElement("Depurture"); <span>// agregando un elemento a</span> Nodo. appendChild(Nodo3); <span>// acceso al campo "Depurture" de la solicitud</span> str:= Query.FieldByName("Depurture").AsString; <span>// creando un nodo de texto = valor de campo</span><span>//asignando un valor al nodo</span> <span>// nodo de texto, cadena variable</span> Nodo.appendChild(txt); <span>// operaciones similares para etiqueta <Destination>, <DataSend>, // <DataDepurture>, <Currency> // <DestinationCompany>(campo DB "Destinatario")</span> Nodo:= Doc.createElement("Destino"); <span>// el nombre del campo de la base de datos puede no coincidir con el nombre</span> str:= Query.FieldByName("Destinatario ").AsString; <span>// etiqueta, esta es la ventaja de usar</span> txt:= Doc.createTextNode(cadena); <span>// DOM de la interfaz frente a un DBMS que soporte una interfaz XML, // como ORACLE 8i o Ms SQL 2000</span> Nodo.appendChild(txt); ... <span>// generando una solicitud de especificaciones para bienes</span> <span>//cierra la solicitud de acceso</span> Consulta.Cerrar; <span>// ver en el texto "solicitud B", información. Acerca de los productos</span> Query.Text:= consultaВ; <span>// asignando valores de parámetros</span> Query.Params.AsInteger:= NúmeroFactura; <span>// ejecuta la solicitud</span> Consulta2.ExecSQL; <span>// abrir acceso para solicitar datos</span> Consulta.Abrir; <span>// crear DOMElement (etiqueta)</span> Nodo3:= Doc.createElement("Imems"); <span>// agregando un elemento a</span> Nodo. appendChild(Nodo3); <span>// recorrer todas las líneas de consulta</span> <b>mientras</b> <b>no</b> Eof.Consulta <b>hacer</b> comenzar Nodo4:= Doc.createElement("Imem"); <span>// agregando un elemento a</span> Nodo3.appendChild(Nodo4); <span>// generando datos para la etiqueta</span> str:= Query.FieldByName("Precio").AsString; txt:= Doc.createTextNode(cadena); Nodo.appendChild(txt); ... <span>// operaciones similares para etiquetas <HZ_Cod>, <Quality>, <GoodName> </span> <b>fin;</b> <b>fin;</b> <p>Como resultado de este procedimiento se genera el siguiente texto del documento XML:</p> <table width="100%"><tbody><tr><td align="middle"><br><img src='https://i1.wp.com/codenet.ru/np-includes/upload/2005/01/05/128661.gif' width="100%" loading=lazy loading=lazy></td> </tr></tbody></table><p>Para formar una solicitud, se utiliza el método Open del objeto. <b>Solicitud IXMLHttp</b>:</p> <b>procedimiento</b> Open(const bstrMethod, - tipo de método ="POST" bstrUrl, - dirección del servidor URL varAsync, - modo de comunicación asíncrono/sincrónico = true bstrUser, - nombre de usuario para autenticación bstrPassword) - contraseña <h2>Crear una parte del servidor de procesamiento de documentos</h2> <p>Como se señaló anteriormente, el procesamiento de solicitudes HTTP se puede realizar mediante aplicaciones CGI o servlets Java. También es posible escribir páginas ASP. Pero en este caso la transferencia de datos sólo es posible mediante el método "GET" mediante una cadena de consulta. Sin embargo, el procesamiento de solicitudes HTTP para páginas ASP es más eficiente que para una aplicación CGI. Sin embargo, en mi opinión, no importa cómo procesarlo, pero lo más importante es resolver la cuestión: cómo construir un programa de procesamiento y no con qué medios.</p> <p>Si en el capítulo anterior analizamos las opciones para generar un documento XML, entonces la tarea de la aplicación del servidor es la opuesta: analizar documentos XML. A continuación se muestra una parte del programa que analiza el documento xml:</p> <b>procedimiento</b> Tthread1.DataParser(Remitente: Tobject); <b>var</b> <span>// declaración de objetos DOMElement</span> r,FNodo: IXMLDOMElement; Str, nombre de archivo: cadena; parm: Cadena; <span>// declaración de una coclase y</span> CoDocXML, CoDocXSL, CoDocResult: CoDomDocument; <span>// objeto XMLDomDocument</span> XMLDoc, XSLDoc, ResultDoc: DomDocument; <span>// HttpStr: Cadena; - variable global que contiene la cadena de solicitud HTTP</span> <b>Comenzar</b> XMLDoc:=coDocXML.Crear; XMLDoc.LoadXML(HttpStr); <span>//obteniendo la dirección del elemento raíz</span> r:=Doc.Get_documentElement; <span>//obteniendo el valor del elemento</span> FNode:= r.SelectSingleNode("//TypeDocument"); <span>// obteniendo el valor del atributo id="Orden"</span> Nombre de archivo:= FNode.GetAttibute("id"); <span>// y formando el nombre del archivo Order.xsl</span> Nombre de archivo:= Nombre de archivo+".xsl"; <span>// crear un documento XSLDoc</span> XSLDoc:=coDocXSL.Crear; XSLDoc.LoadXML(Nombre de archivo); <span>// crear un documento XMLDoc</span> DocumentoResultado:=coDocResultado.Crear; <span>// configurando el modo de procesamiento sincrónico</span> ResultDoc.Set_async(falso); <span>// establece la verificación de análisis</span> ResultDoc.validateOnParse:= verdadero; <span>// analiza XMLDoc usando una plantilla XSL</span> XMLDoc.transformNodeToObject(XSLDoc, ResultDoc); <span>// a la variable Str se le asigna un valor de texto</span> <span>// el documento resultante.</span> Str:= ResultadoDoc.texto; <span>// buscar elemento</span> FNode:= r.SelectSingleNode("//NumeroFactura"); <span>// y obteniendo el valor del elemento</span> parm:= FNode.text; <span>//cierra la solicitud de acceso</span> Consulta.Cerrar; Consulta.Texto:= Cadena; <span>//asignando un valor de parámetro</span> Query.Params.AsString:= parm; <span>// ejecuta la solicitud</span> Consulta.ExecSQL; <b>fin;</b> <p>Lo más destacado del análisis es 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 realizará los cambios necesarios en los datos del DBMS.</p> <p>La ventaja de utilizar el análisis a través de una plantilla es que los datos son algo flexibles y el funcionamiento del algoritmo es completamente independiente del código del programa. A continuación se muestra el texto de la plantilla XSL utilizada para procesar un documento de PEDIDO:</p><p> <!-- файл Order.xsl --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <xsl:for-each select="//header">INSERTAR en TABREG (DESDE, HASTA, TYPEDOC,cuerpo) VALORES(" <xsl:value-of select="from" />", "<xsl:value-of select="to" />", "<xsl:value-of select="TypeDocument/@id" />") </xsl:for-each> <xsl:for-each select="//item">INSERTAR en PRODUCTOS (Número de factura, nombre, precio, calidad) VALORES(" :num", " <xsl:value-of select="name" />", "<xsl:value-of select="price" />", "<xsl:value-of select="quality" /> ") </xsl:for-each> </xsl:template> </xsl:stylesheet> </p><p>Al explicar el ejemplo anterior, cabe señalar que el uso de un par de etiquetas es de naturaleza formal, porque 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 documento XML ResultDoc obtenido durante el análisis. En este caso, el valor es todo lo que está enmarcado por un par de etiquetas y, es decir, La consulta SQL que generamos.</p> <p>Otra característica de escribir un programa es la posibilidad de utilizar un parámetro SQL. <b>:núm.</b> El uso de este parámetro le permite simplificar el texto de la plantilla xsl. La determinación del significado de los elementos de nodo correspondientes de un documento XML se determina seleccionando inicialmente el nombre del nodo correspondiente, por ejemplo:</p><h2>Brevemente sobre XSL</h2> <p>La abreviatura XSL proviene de eXtensible Stylesheet Language, un lenguaje para formatear hojas de estilo (datos XML). Como sugiere el título, el lenguaje de hoja de estilo extensible (XSL) se utiliza para formatear datos XML. Según la definición del W3C, XSL consta de dos partes:</p> <ul><li>XSLT - Transformación XSL. Un lenguaje utilizado para convertir o formatear (transformar) documentos XML. Así, con la ayuda de XSLT podemos obtener diferentes secciones del conjunto de datos y formas de presentación de datos.</li><li>Elementos de formato. Estos elementos incluyen todos los elementos del diseño tipográfico de los datos, después de que hayan sido procesados ​​mediante XSL. Se utiliza únicamente para generar páginas HTML.</li> </ul><p>Usando XSLT, podemos seleccionar los datos que necesitamos de un archivo XML y organizarlos en un formulario para presentarlos al usuario. Por ejemplo, en nuestro caso, convertimos datos XML en una consulta SQL. El uso clásico de XSL es, por regla general, formatear datos en forma de páginas HTML o, más raramente, en forma de archivos RTF.</p> <p>El archivo XSL describe la plantilla según la cual se convertirán los datos XML. Volviendo a las plantillas xsl, en XSLT se pueden distinguir los siguientes elementos (directivas):</p> <table cellspacing="0" cellpadding="4" width="500" border="1"><tbody><tr><td valign="top" width="31%"> <b>Directivas XSL</b> </td><th align="middle" width="69%"> <b>descripción</b> </th> </tr><tr><td>xsl: aplicar plantillas</td> <td>Directiva que indica la aplicación de las plantillas correspondientes al atributo select="nombre de plantilla"</td> </tr><tr><td>xsl:atributo</td> <td>crea un árbol de atributos y lo agrega al elemento de salida, nombre del parámetro="nombre del atributo", espacio de nombres - URI al espacio de nombres (prefijo del espacio de nombres)</td> </tr><tr><td>xsl: plantilla de llamada</td> <td>llama a la plantilla, atributo nombre="URI a plantilla"</td> </tr><tr><td>xsl:elegir <br>xsl: cuando <br>xsl: de lo contrario</td> <td>haciendo una selección basada en xsl: cuando expr="evaluando una expresión en un script", <br>idioma="nombre-idioma" <br>prueba= "expresión evaluada"</td> </tr><tr><td>xsl: comentario</td> <td>genera un comentario en el documento de salida</td> </tr><tr><td>xsl:copiar <br>xsl:copia de</td> <td>copia el nodo actual en la fuente de salida o pega un fragmento de documento en el nodo donde el atributo de selección = "nombre del nodo de origen"</td> </tr><tr><td>xsl: elemento</td> <td>crea un elemento de salida por nombre, atributo nombre="nombre del elemento", namespace="referencia del espacio de nombres uri"</td> </tr><tr><td>xsl: para cada uno</td> <td>vuelve a aplicar la plantilla a todos los nodos en la lista de nodos, el atributo de selección especifica la lista de nodos</td> </tr><tr><td>xsl: si</td> <td>comprobar la condición, especificada por el atributo de prueba como una expresión</td> </tr><tr><td>xsl: incluir</td> <td>incluye plantilla externa, atributo href = "referencia URI"</td> </tr><tr><td>xsl: salida</td> <td>especifica el resultado de salida, el atributo del método puede tener los valores "xml", "html" o "text"</td> </tr><tr><td>xsl:parámetro</td> <td>especifica el valor de los parámetros, nombre del atributo="nombre del parámetro", select = "valor"</td> </tr><tr><td>xsl: instrucción-de-procesamiento</td> <td>crea una instrucción de procesamiento, nombre de atributo="nombre de instrucción de proceso"</td> </tr><tr><td>xsl:ordenar</td> <td>ordena múltiples nodos, atributos select = "nombre de nodo", tipo de datos = tipo de datos ("texto" | "número" | Qname), orden = dirección de clasificación ("ascendente" | "descendente")</td> </tr><tr><td>xsl: hoja de estilo</td> <td>define un documento de plantilla xsl, es el elemento raíz de XSLT</td> </tr><tr><td>xsl:plantilla</td> <td>define una plantilla xsl, atributo nombre= "prefijo URI al nombre de la plantilla", match= "indicación del nodo al que se aplica la plantilla"</td> </tr><tr><td>xsl:texto</td> <td>genera texto en el flujo de salida, el atributo de escape de salida = "sí" o "no", indica la capacidad de generar caracteres ESC</td> </tr><tr><td>xsl: valor de</td> <td>inserta el valor del nodo seleccionado como texto, el atributo de selección = "puntero al nodo" del cual se toma el valor</td> </tr><tr><td>xsl:variable</td> <td>especifica el valor de los límites de la variable, nombre del atributo = "nombre de la variable", seleccione = "cálculo del valor de la variable"</td> </tr><tr><td>xsl:con-param</td> <td>aplica un parámetro a una plantilla, atributo de nombre = "nombre del parámetro", seleccione = expresión para evaluar el contexto actual, valor predeterminado "."</td> </tr></tbody></table><h2>Conclusión</h2> <p>Finalmente, cabe señalar que el uso de un analizador XML estándar <i>msxml.dll</i> no es la única herramienta para analizar y crear documentos XML. Por ejemplo, para crear documentos XML es eficaz utilizar componentes <b>TPageProduser</b> Y <b>TTableProduser</b>. Pero este artículo sólo enfatiza la amplitud y posibilidad de utilizar el modelo DOM en la práctica.</p> <p>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. del lado práctico del uso de documentos XML en el comercio electrónico. Puede encontrar información más detallada sobre el aspecto práctico del uso de documentos electrónicos en el sitio web del autor www.eDocs.al.ru. También está previsto publicar textos fuente y ejemplos en el sitio web del autor.</p> <script>document.write("<img style='display:none;' src='//counter.yadro.ru/hit;artfast_after?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 class="evc-social-likes" data-url="https://ymol.ru/how-to-work/ispolzovanie-xml-v-srede-delphi-ispolzovanie-xml-document-object-model/" data-title="Usando XML en el entorno Delphi. Usando el modelo de objetos de documento XML" data-media="https://i1.wp.com/zoo-mania.ru/wp-content/uploads/2011/08/settings.ini_.jpg"> <div class="social-likes "> <div class="facebook" title="Compartir enlace en Facebook">Facebook</div> <div class="twitter" title="Compartir enlace en Twitter">Gorjeo</div> <div class="vkontakte" title="Compartir enlace en VKontakte">En contacto con</div> <div class="plusone" title="Compartir enlace en Google Plus">Google+</div> </div> </div> <span class="thecategory"><i class="icon-globe"></i> <a href="https://ymol.ru/es/category/how-to-work/" rel="category tag">Como trabajar</a></span> </div> </article> <div class="post-tags"></div> <div class="related-posts"> <h4>También te puede interesar</h4> <article id="post-36374" class="latestpost post-36374 post type-post status-publish format-standard hentry category-poleznye-sovety"> <a href="https://ymol.ru/es/operation/kak-abonentam-mts-uznat-svoi-nomer-telefona-mobilnyi/" title="Internet móvil de MTS" id="featured-thumbnail"> <div class="featured-thumbnail"> <img src="/uploads/0637926dfa0061433afd588fbf5583cc.jpg" alt="Internet móvil de MTS" / loading=lazy loading=lazy> </div> </a> <header class="entry-header"> <h1 class="entry-title"><a href="https://ymol.ru/es/operation/kak-abonentam-mts-uznat-svoi-nomer-telefona-mobilnyi/" rel="bookmark">Internet móvil de MTS</a></h1> </header> </article> <article id="post-36373" class="latestpost post-36373 post type-post status-publish format-standard hentry category-poleznye-sovety"> <a href="https://ymol.ru/es/reviews/programma-chtoby-zapisyvat-cd-desyatka-besplatnyh-programm-dlya-zapisi/" title="Diez programas gratuitos para grabar discos ópticos" id="featured-thumbnail"> <div class="featured-thumbnail"> <img src="/uploads/db92ce5b818edead87740507e0c79c7b.jpg" alt="Diez programas gratuitos para grabar discos ópticos" / loading=lazy loading=lazy> </div> </a> <header class="entry-header"> <h1 class="entry-title"><a href="https://ymol.ru/es/reviews/programma-chtoby-zapisyvat-cd-desyatka-besplatnyh-programm-dlya-zapisi/" rel="bookmark">Diez programas gratuitos para grabar discos ópticos</a></h1> </header> </article> <article id="post-36372" class="latestpost post-36372 post type-post status-publish format-standard hentry category-poleznye-sovety"> <a href="https://ymol.ru/es/wi-fi/prosmotr-dvd-diska-na-noutbuke-i-kompyutere-windows-ne-vidit-cd-ili-dvd-diskovod-chto/" title="Windows no ve la unidad de CD o DVD" id="featured-thumbnail"> <div class="featured-thumbnail"> <img src="/uploads/e8ac8b5dfe614f4e051c12722bca05c1.jpg" alt="Windows no ve la unidad de CD o DVD" / loading=lazy loading=lazy> </div> </a> <header class="entry-header"> <h1 class="entry-title"><a href="https://ymol.ru/es/wi-fi/prosmotr-dvd-diska-na-noutbuke-i-kompyutere-windows-ne-vidit-cd-ili-dvd-diskovod-chto/" rel="bookmark">Windows no ve la unidad de CD o DVD</a></h1> </header> </article> </div> </main> <div id="sidebar" class="sidebar c-4-12" role="complementary" itemscope itemtype="http://schema.org/WPSideBar"> <aside id="recent-posts-3" class="widget widget_recent_entries"> <h3 class="widget-title">Más popular</h3> <ul> <li class='li1'><a href='https://ymol.ru/es/instructions/red-energy-super-mts-i-posekundnyi-mts-obnovili-svoe-yaico-socialnaya/' title='MTS actualizó su"яйцо" Социальная активность оператора'>MTS ha actualizado su “huevo” Actividad social del operador</a></li> <li class='li1'><a href='https://ymol.ru/es/reviews/vychislyaemoe-pole-v-skd-1s-8-3-yazyk-vyrazhenii-sistemy-komponovki/' title='Campo calculado en SKD 1s 8'>Campo calculado en SKD 1s 8</a></li> <li class='li1'><a href='https://ymol.ru/es/how-to-work/elektronnaya-pochta-kak-sredstvo-obespecheniya-delovyh-kommunikacii/' title='Comunicación empresarial electrónica Las herramientas de comunicación son muy importantes.'>Comunicación empresarial electrónica Las herramientas de comunicación son muy importantes.</a></li> <li class='li1'><a href='https://ymol.ru/es/operation/uvelichivaem-gromkost-mp3-faila-obrabotka-zapisei-s-diktofona-s-pomoshchyu/' title='Procesamiento de grabaciones de una grabadora de voz utilizando Adobe Audition Un programa para mejorar las grabaciones de audio de una grabadora de voz'>Procesamiento de grabaciones de una grabadora de voz utilizando Adobe Audition Un programa para mejorar las grabaciones de audio de una grabadora de voz</a></li> <li class='li1'><a href='https://ymol.ru/es/reviews/moskovskii-gosudarstvennyi-universitet-pechati-federalnoe-agentstvo-po/' title='Agencia Federal para la Educación Heurística de la información'>Agencia Federal para la Educación Heurística de la información</a></li> <li class='li1'><a href='https://ymol.ru/es/operation/ne-gruzitsya-windows-10-v-ahci-vklyuchaem-ahci-rezhim-v-bios-kak-proverit-vklyuchen-li/' title='Habilite el modo AHCI en BIOS'>Habilite el modo AHCI en BIOS</a></li> <li class='li1'><a href='https://ymol.ru/es/beginning/chto-takoe-klasterizaciya-semanticheskogo-yadra-i-kak-delat-gruppirovku/' title='Agrupación del núcleo semántico y consultas del motor de búsqueda Agrupación de consultas en el núcleo semántico'>Agrupación del núcleo semántico y consultas del motor de búsqueda Agrupación de consultas en el núcleo semántico</a></li> <li class='li1'><a href='https://ymol.ru/es/setting/kak-v-skaipe-pokazat-svoi-ekran-sobesedniku-kakie-vozmozhnosti-dostupny-v/' title='¿Qué funciones están disponibles en las llamadas de Skype?'>¿Qué funciones están disponibles en las llamadas de Skype?</a></li> <li class='li1'><a href='https://ymol.ru/es/choice/ne-zapuskaetsya-autocad-parallelnaya-konfiguraciya-nepravilna-kak/' title='Cómo solucionar el error "La aplicación no pudo iniciarse porque su configuración paralela es incorrecta"'>Cómo solucionar el error "La aplicación no pudo iniciarse porque su configuración paralela es incorrecta"</a></li> <li class='li1'><a href='https://ymol.ru/es/beginning/telekarta-odno-oborudovanie-na-neskolko-televizorov-kak-podklyuchit-dva/' title='Cómo conectar dos televisores a una antena parabólica'>Cómo conectar dos televisores a una antena parabólica</a></li> </ul> </aside> <aside id="wpforo_widget_recent_topics-2" class="widget widget_wpforo_widget_recent_topics"><div id="wpf-widget-recent-replies" class="wpforo-widget-wrap"><h3 class="widget-title">nuevos mensajes</h3><div class="wpforo-widget-content"><ul> <li> <div class="wpforo-list-item"> <div class="wpforo-list-item-left"> <img class="avatar" src="/uploads/e71372f2d81f494ed54bb8cf89310863.jpg" height="96" width="96" / loading=lazy loading=lazy> </div> <div class="wpforo-list-item-right"> <p class="posttitle"><a href="https://ymol.ru/es/wi-fi/bp-programmy-programmy-dlya-noutbuka-prostaya-programma-dlya-skachivaniya-igr/">Programas de BP. Programas para portátiles. Un programa sencillo para descargar juegos a tu ordenador.</a></p> <p class="postuser">2024-05-15 03:08:19</p> </div> <div class="wpf-clear"></div> </div> </li> <li> <div class="wpforo-list-item"> <div class="wpforo-list-item-left"> <img class="avatar" src="/uploads/3e26b340d0a794722aac41bf4af0cd69.jpg" height="96" width="96" / loading=lazy loading=lazy> </div> <div class="wpforo-list-item-right"> <p class="posttitle"><a href="https://ymol.ru/es/instructions/telefon-htc-opisanie-i-harakteristiki-htc-one-m7---tehnicheskie-harakteristiki/">HTC One M7 - Especificaciones</a></p> <p class="postuser">2024-05-08 03:08:34</p> </div> <div class="wpf-clear"></div> </div> </li> <li> <div class="wpforo-list-item"> <div class="wpforo-list-item-left"> <img class="avatar" src="/uploads/8e3803b8a9cee6638730e12090da84b9.jpg" height="96" width="96" / loading=lazy loading=lazy> </div> <div class="wpforo-list-item-right"> <p class="posttitle"><a href="https://ymol.ru/es/choice/regulyarnye-vyrazheniya-poisk-ne-vklyuchaya-stroku-javascript-regulyarnoe/">Javascript, expresión regular: ejemplos, comprobación de expresiones regulares</a></p> <p class="postuser">2024-05-05 03:13:30</p> </div> <div class="wpf-clear"></div> </div> </li> <li> <div class="wpforo-list-item"> <div class="wpforo-list-item-left"> <img class="avatar" src="/uploads/568b281d61696cb02e39bd7680ae9b3e.jpg" height="96" width="96" / loading=lazy loading=lazy> </div> <div class="wpforo-list-item-right"> <p class="posttitle"><a href="https://ymol.ru/es/overview/m1-b-3-kompyuternye-tehnologii-v-nauke-i-proizvodstve-kompyuternye/">M1.B.3 Tecnologías informáticas en la ciencia y la producción. Tecnologías informáticas en la ciencia y la educación Tecnologías informáticas en la ciencia y la producción</a></p> <p class="postuser">2024-05-04 03:24:12</p> </div> <div class="wpf-clear"></div> </div> </li> <li> <div class="wpforo-list-item"> <div class="wpforo-list-item-left"> <img class="avatar" src="/uploads/49f66e5b2f9388fa11971c779148e0b9.jpg" height="96" width="96" / loading=lazy loading=lazy> </div> <div class="wpforo-list-item-right"> <p class="posttitle"><a href="https://ymol.ru/es/instructions/progress-dispetchera-zagruzok-ne-otobrazhaetsya-v-oblasti/">Por qué los archivos no son visibles en la unidad flash y cómo solucionarlo Por qué los archivos descargados no se muestran en Descargas</a></p> <p class="postuser">2024-05-02 03:11:13</p> </div> <div class="wpf-clear"></div> </div> </li> </ul></div></div></aside><aside id="categories-2" class="widget widget_categories"><h3 class="widget-title">Categorías</h3> <ul> <li class="cat-item cat-item-84"><a href="https://ymol.ru/es/category/bluetooth/">Bluetooth</a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/es/category/wi-fi/">Wifi</a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/es/category/choice/">Elección </a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/es/category/instructions/">Instrucciones</a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/es/category/how-to-work/">Como trabajar</a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/es/category/setting/">Ajustes </a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/es/category/beginning/">Comenzar</a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/es/category/overview/">Revisar</a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/es/category/overview/">Revisar </a> </li> <li class="cat-item cat-item-84"><a href="https://ymol.ru/es/category/reviews/">Reseñas</a> </li> </ul> </aside><aside id="dwqa-latest-question-2" class="widget widget_categories"><h3 class="widget-title">Nuevos artículos</h3><ul> <li class="cat-item"><a href="https://ymol.ru/es/setting/nl-interneshnl-lichnyi-kabinet-vhod-nl-international-otzyvy-interesuyut/">NL International: ¿está interesado en reseñas?</a></li> <li class="cat-item"><a href="https://ymol.ru/es/setting/svetyashchiesya-linii-dlya-fotoshopa-kak-sozdat-svetyashchiesya-linii-v/">Cómo crear líneas brillantes en Photoshop, de forma rápida y hermosa</a></li> <li class="cat-item"><a href="https://ymol.ru/es/operation/kak-abonentam-mts-uznat-svoi-nomer-telefona-mobilnyi/">Internet móvil de MTS</a></li> <li class="cat-item"><a href="https://ymol.ru/es/reviews/programma-chtoby-zapisyvat-cd-desyatka-besplatnyh-programm-dlya-zapisi/">Diez programas gratuitos para grabar discos ópticos</a></li> <li class="cat-item"><a href="https://ymol.ru/es/wi-fi/prosmotr-dvd-diska-na-noutbuke-i-kompyutere-windows-ne-vidit-cd-ili-dvd-diskovod-chto/">Windows no ve la unidad de CD o DVD</a></li> <li class="cat-item"><a href="https://ymol.ru/es/instructions/red-energy-super-mts-i-posekundnyi-mts-obnovili-svoe-yaico-socialnaya/">MTS ha actualizado su “huevo” Actividad social del operador</a></li> <li class="cat-item"><a href="https://ymol.ru/es/reviews/vychislyaemoe-pole-v-skd-1s-8-3-yazyk-vyrazhenii-sistemy-komponovki/">Campo calculado en SKD 1s 8</a></li> <li class="cat-item"><a href="https://ymol.ru/es/how-to-work/elektronnaya-pochta-kak-sredstvo-obespecheniya-delovyh-kommunikacii/">Comunicación empresarial electrónica Las herramientas de comunicación son muy importantes.</a></li> <li class="cat-item"><a href="https://ymol.ru/es/operation/uvelichivaem-gromkost-mp3-faila-obrabotka-zapisei-s-diktofona-s-pomoshchyu/">Procesamiento de grabaciones de una grabadora de voz utilizando Adobe Audition Un programa para mejorar las grabaciones de audio de una grabadora de voz</a></li> <li class="cat-item"><a href="https://ymol.ru/es/reviews/moskovskii-gosudarstvennyi-universitet-pechati-federalnoe-agentstvo-po/">Agencia Federal para la Educación Heurística de la información</a></li> </ul></aside></div> </div> </div> </div> <footer id="colophon" class="site-footer" role="contentinfo"> <div class="site-info container"> <div class="copyrights"> <span class="sep"> </span> ymol.ru - Todo sobre tabletas - Portal de información</div> <a href="#blog" class="toplink" ><i class="icon-angle-up"></i></a> <nav id="navigation" class="footer-navigation" role="navigation"> <div class="menu-footer-menu-container"><ul id="menu-footer-menu" class="menu"> <li class="menu-item type-post_type object-page "><a href="https://ymol.ru/es/sitemap.xml">Mapa del sitio</a></li> <li class="menu-item type-post_type object-page "><a href="https://ymol.ru/es/feedback/">Contactos</a></li> </ul></div> </nav> </div> </footer> </div> <div id="vk_api_transport"></div> <script type="text/javascript"> jQuery(document).ready(function ($) { if ($('.social-likes')) { $('.social-likes').each(function () { var p = $(this).parent(); if (p.data('url')) { $(this).data({ 'url': p.data('url'), 'title': p.data('title') } ); } if ($(this).find('.pinterest').length) { if (p.data('media')) { $($(this).find('.pinterest')[0]).data({ 'media': p.data('media') } ); } else $($(this).find('.pinterest')[0]).remove(); } } ); $('.social-likes').socialLikes({ zeroes: 0 } ); } } ); </script> <script type='text/javascript' src='https://ymol.ru/wp-content/plugins/akismet/_inc/form.js?ver=3.2'></script> <script type='text/javascript' src='https://ymol.ru/wp-content/plugins/easy-vkontakte-connect/js/evc-share.js'></script> <script type='text/javascript' src='https://ymol.ru/wp-content/plugins/easy-vkontakte-connect/js/social-likes.min.js?ver=3.0.4'></script> <script type='text/javascript' src='https://ymol.ru/wp-content/plugins/contact-form-7/includes/js/jquery.form.min.js?ver=3.51.0-2014.06.20'></script> <script type='text/javascript' src='https://ymol.ru/wp-content/plugins/contact-form-7/includes/js/scripts.js?ver=4.5.1'></script> <script type='text/javascript' src='https://ymol.ru/wp-content/plugins/wp-review/assets/js/main.js?ver=4.0.6'></script> <script type='text/javascript' src='https://ymol.ru/wp-content/themes/sociallyviral/js/customscripts.js?ver=20120212'></script> <script type='text/javascript' src='/wp-includes/js/comment-reply.min.js?ver=4.6.9'></script> <script type='text/javascript' src='/wp-includes/js/wp-embed.min.js?ver=4.6.9'></script> <script>setTimeout( function(){ jQuery.post('/wp-content/plugins/kama-postviews/ajax-request.php',{ meta_id:'1438', view_type:'post_view', relpath:'' } ,function(result){ jQuery('.ajax_views').html(result); } );} , 2000);</script> <script>function lc_get_cookie(name) { var c = document.cookie;if (c.indexOf(name) != -1) { var x = c.indexOf(name)+name.length+1;var y = c.indexOf(";",x);if (y < 0) y = c.length;return decodeURIComponent(c.substring(x,y));} else return "";} if ((d = document.getElementById("commentform")) != null) { e = d.elements;var z = lc_get_cookie("comment_author_email_27b5a291828a105bf783f92a6d070718");if (z != "") e["email"].value = z;z = lc_get_cookie("comment_author_27b5a291828a105bf783f92a6d070718");if (z != "") e["author"].value = z.replace(/\+/g, " ");z = lc_get_cookie("comment_author_url_27b5a291828a105bf783f92a6d070718");if (z != "") e["url"].value = z;} </script></body></html>