¿Cómo se manejan los espacios en blanco en el modelo de objetos XML?
A veces, el modelo de objetos XML mostrará nodos de TEXTO que contienen caracteres de espacio en blanco. Cuando los espacios en blanco se truncan, es probable que se produzca cierta confusión. Por ejemplo, el siguiente ejemplo XML:
]>
Herrero
John
Se genera el siguiente árbol:
Instrucción de procesamiento: xml
Tipo de documento: persona
ELEMENTO: persona
TEXTO:
ELEMENTO: apellido
TEXTO:
ELEMENTO: nombre
TEXTO:
Los nombres y apellidos están rodeados por nodos de TEXTO que contienen solo espacios en blanco porque el modelo de contenido del elemento "persona" es MIXTO y contiene la palabra clave #PCDATA. El modelo de contenido MIXTO especifica que puede existir texto entre elementos. Por tanto, también es correcto lo siguiente:
Mi apellido es Smith y mi nombre es
John
El resultado es un árbol similar al siguiente:
ELEMENTO: persona
TEXTO: Mi apellido es
ELEMENTO: apellido
TEXTO: y mi nombre es
ELEMENTO: nombre
TEXTO:
Sin los espacios en blanco después y antes de la palabra "es" y los espacios en blanco después y antes de la palabra "y", la oración sería ininteligible. Por lo tanto, para el modelo de contenido MIXTO, las combinaciones de texto, los espacios en blanco y los elementos son todos relevantes. Este no es el caso de los modelos de contenido no MIXTO.
Para hacer que desaparezcan los nodos de TEXTO de solo espacios en blanco, elimine la palabra clave #PCDATA de la declaración del elemento "persona":
el resultado es el siguiente árbol claro:
Instrucción de procesamiento: xml
Tipo de documento: persona
ELEMENTO: persona
ELEMENTO: apellido
ELEMENTO: nombre
¿Qué hace la declaración XML?
La declaración XML debe aparecer en la parte superior del documento XML:
especifica los siguientes elementos:
El documento es un documento XML. Los detectores MIME pueden usar esto para detectar si un archivo es de tipo texto/xml cuando falta el tipo MIME o no se ha especificado.
El documento cumple con la especificación XML 1.0. Esto será importante en el futuro cuando existan otras versiones de XML.
Codificación de caracteres del documento. El atributo de codificación es opcional y el valor predeterminado es UTF-8.
Nota: La declaración XML debe estar en la primera línea del documento XML, por lo que el siguiente archivo XML:
produce el siguiente error de análisis:
Declaración xml no válida.
Línea 0000002:
Ubicación 0000007: ------^
Nota: la declaración XML es opcional. Si necesita especificar comentarios o instrucciones de procesamiento en la parte superior, no incluya una declaración XML. Sin embargo, la codificación predeterminada será UTF-8.
¿Cómo imprimo mi documento XML en un formato legible?
Al construir un documento desde cero usando DOM para producir un archivo XML, todo está en una línea, sin espacios entre ellos. Este es el comportamiento predeterminado.
Construye la hoja de estilos XSL predeterminada en Internet Explorer 5 para mostrar e imprimir documentos XML en un formato legible. Por ejemplo, si IE5 ya está instalado, intente mirar el archivo nospace.xml. El siguiente árbol debería aparecer en el navegador:
-
-
XYZ
12.56
No se insertan caracteres de espacio en blanco en XML.
Imprimir XML legible es muy interesante, especialmente cuando hay DTD que definen diferentes tipos de modelos de contenido. Por ejemplo, bajo el modelo de contenido mixto (#PCDATA) no puede insertar espacios porque podría cambiar el significado del contenido. Por ejemplo, considere el siguiente XML:
Elefante
Es mejor que esto no se muestre como:
E
elefante
Porque los límites de las palabras ya no son correctos.
Todo esto hace que la impresión automatizada sea problemática. Si no necesita imprimir XML legible, puede usar DOM para insertar caracteres de espacio en blanco como nodos de texto en las ubicaciones apropiadas.
¿Cómo utilizar espacios de nombres en DTD? Para utilizar un espacio de nombres en una DTD, declararlo en la declaración ATTLIST del elemento que lo utiliza, de la siguiente manera:
El tipo de espacio de nombres debe ser #FIXED. Lo mismo ocurre con los espacios de nombres de atributos:
espacios de nombres y esquemas XML. Las DTD y los esquemas XML no se pueden mezclar. Por ejemplo, el siguiente
xmlns:x CDATA #FIXED "x-schema:myschema.xml"
No hará que se utilice la definición de esquema definida en myschema.xml. El uso de esquemas DTD y XML son mutuamente excluyentes.
¿Cómo utilizar XMLDSO en Visual Basic?
Utilice el siguiente XML como ejemplo:
Marcos Hanson
206 765 4583
fulana
425 808 1111
Puede vincularse a un conjunto de registros ADO de la siguiente manera:
Cree un nuevo proyecto de VB 6.0.
Agregue referencias a Microsoft ActiveX Data Objects 2.1 o posterior, Microsoft Data Adapter Library y Microsoft XML versión 2.0.
Utilice el siguiente código para cargar datos XML en el control XML DSO:
Atenuar dso como nuevo XMLDSOControl
Documento tenue como documento IXMLDOM
Establecer documento = dso.XMLDocument
doc.Load ("d:test.xml")
usa el siguiente código para asignar el DSO a un nuevo objeto de conjunto de registros usando DataAdapter:
Dim da como nuevo adaptador de datos
Establecer da.Object = dso
Dim rs como nuevo ADODB.Recordset
Establecer rs.DataSource = da
Datos de acceso:
MsgBox rs.Fields("nombre").El valor
da como resultado la cadena "Mark Hanson"
¿Cómo utilizar XML DOM en Java?
Debe estar instalada la versión IE5 de MSXML.DLL. En Visual J++ 6.0, seleccione Agregar contenedor COM en el menú Proyecto y luego seleccione "Microsoft XML 1.0" en la lista de objetos COM. Esto construirá el contenedor Java requerido en un nuevo paquete llamado "msxml". Estos contenedores de Java prediseñados también están disponibles para descargar. Las clases se pueden utilizar de la siguiente manera:
importar com.ms.com.*;
importar msxml.*;
clase pública Clase1
{
principal vacío estático público (String[] args)
{
DOMDocument doc = nuevo DOMDocument();
doc.load(nueva variante(" file://d:/samples/ot.xml "));
System.out.println("Cargado " + doc.getDocumentElement().getNodeName());
}
}
El ejemplo de código cargará el archivo de prueba de 3,8 MB "ot.xml" del ejemplo de religión solar. La clase Variant envuelve el tipo básico Win32 VARIANT.
Debido a que en realidad obtienes un nuevo contenedor cada vez que recuperas un nodo, no puedes usar comparaciones de punteros en nodos. Así que no uses el código siguiente,
IXMLDOMNode raíz1 = doc.getDocumentElement();
IXMLDOMNode raíz2 = doc.getDocumentElement();
si (raíz1 == raíz2)...
En su lugar utilice el siguiente código:
si (ComLib.isEqualUnknown (raíz1, raíz2)) ....
El tamaño total del contenedor .class es de aproximadamente 160 KB. Sin embargo, para cumplir plenamente con la especificación W3C, solo se deben utilizar contenedores IXMLDOM*. Las siguientes clases son interfaces XML antiguas de IE 4.0 y se pueden eliminar de la carpeta msxml:
Atributo IXML*,
Documento IXML*, Documento XML*
Elemento IXML*,
Error IXML*,
Colección IXMLElement*,
etiquetaXMLEMEM_TYPE*
_xml_error*
Esto reduce el tamaño a 147 KB. También puede eliminar los siguientes elementos:
DOMFreeThreadedDocumento
Acceda a documentos XML desde múltiples subprocesos en aplicaciones Java.
Solicitud XMLHttp
Utilice la extensión XML DAV HTTP para comunicarse con el servidor.
IXTLRuntime
Defina el objeto de secuencia de comandos de la hoja de estilos XSL.
Control XMLDSO
Se vincula a datos XML en una página HTML.
XMLDOMDocumentoEventos
Devolución de llamada durante el análisis.
Esto reduce el tamaño a 116 KB. Para hacerlo aún más pequeño, considere el hecho de que el DOM en sí tiene dos capas: la capa central consta de:
Documento DOM, documento IXMLDOM
Nodo IXMLDOM*
Lista de nodos IXMLDOM*
IXMLDOMMapa de nodos con nombre*
IXMLDOMDocumentoFragmento*
IXMLDOMImplementación
IXMLDOMParseError
E información de DTD que los usuarios pueden necesitar conservar:
IXMLDOMTipo de documento
IXMLDOMentidad
Notación IXMLDOM
Todos los tipos de nodos en un documento XML son IXMLDOMNodes, que proporcionan funcionalidad completa, pero existen contenedores de nivel superior para cada tipo de nodo. Por lo tanto, si modifica el contenedor DOMDocument y cambia estos tipos específicos para usar IXMLDOMNode, se pueden eliminar todas las interfaces siguientes:
Atributo IXMLDOM
Sección IXMLDOMCDATA
IXMLDOMDatos de carácter
IXMLDOMComentario
Elemento IXMLDOM
Instrucción de procesamiento IXMLDOM
IXMLDOMEntidadReferencia
IXMLDOMTexto
Eliminarlos reducirá el tamaño a 61 KB. Sin embargo, para IXMLDOMElement, tanto el método getAttribute como el setAttribute son útiles. De lo contrario necesitas usar:
IXMLDOMNode.getAttributes().setNamedItem(...)