Autor: AngelGavin Fuente: CSDN
¿Cómo cargar documentos con caracteres extranjeros y especiales?
Los documentos pueden contener caracteres extranjeros, como:
caracteres extranjeros (úóí?)
Por ejemplo, los caracteres extranjeros como 粲 deben ir precedidos de una secuencia de escape. Los caracteres extranjeros pueden codificarse en UTF-8 o especificarse con una codificación diferente, de la siguiente manera:
caracteres extranjeros (?磲)
El XML ahora está cargado correctamente.
Otros caracteres están reservados en XML y deben manejarse de manera diferente. XML a continuación:
esto y aquello
Se produce el siguiente error:
Aquí no se permiten espacios.
Línea 0000001: esto y aquello
Ubicación 0000012: ----------^
Aquí & es parte de la estructura de sintaxis XML. Si simplemente se coloca dentro de la fuente de datos XML, no se puede interpretar como &. Debe reemplazar secuencias de caracteres especiales llamadas "entidades".
esto y aquello
Los siguientes caracteres requieren entidades correspondientes:
< <
& &
>>
" "
''
El carácter de comilla se usa como delimitador para los valores de atributos en el marcado y, por lo tanto, generalmente no se puede usar dentro de los valores de atributos. Por ejemplo, lo siguiente devolverá un error:
La comilla simple aquí se utiliza como delimitador de atributo y dentro del valor del atributo mismo. Para corregir este problema, puede cambiar el delimitador del atributo a comillas dobles:
o puede escapar las comillas simples a la entidad.
Ambos métodos anteriores devolverán el valor del atributo John's Stuff a través del método getAttribute en el modelo de objetos XML. Asimismo, para comillas dobles puedes utilizar la entidad ".
También puede manejar caracteres especiales en el contenido del elemento colocando el texto en una sección CDATA. Lo siguiente es correcto:
en este ejemplo, el modelo de objetos XML muestra el nodo CDATA como un nodo secundario del nodo xml, que devuelve la cadena
This & that es solo contenido de "texto".
como valor de nodo.
¿Cómo utilizar el componente COM MSXML en Visual Studio 6.0 C++?
La forma más sencilla de utilizar componentes MSXML COM en Visual C++ 6.0 es utilizar la directiva #import:
#import "msxml.dll" named_guids no_namespace#import "msxml.dll" named_guids no_namespace
Define todas las interfaces IXML* y los ID de interfaz para que puedan usarse en aplicaciones. La biblioteca de tipos MSXML y los archivos de encabezado (en inglés) también están disponibles en INETSDK, así como uuid.lib que contiene los IID de clase.
¿Cómo utilizar entidades HTML en XML?
El siguiente XML contiene entidades HTML:
Copyright 2000, Microsoft Inc. Todos los derechos reservados.
Produce el siguiente error:
Referencia a la entidad indefinida 'copia'.
Línea: 1, Posición: 23, Código de error: 0xC00CE002
Derechos de autor 2000,...
-----------------------^
Esto se debe a que XML sólo tiene cinco entidades integradas. Para obtener más información sobre las entidades integradas, consulte ¿Cómo cargo documentos con caracteres extranjeros y especiales? .
Para utilizar entidades HTML, debe definirlas con una DTD. Para obtener más información sobre las DTD, consulte las Recomendaciones XML del W3C (en inglés). Para utilizar esta DTD, inclúyala directamente en la etiqueta DOCTYPE, de la siguiente manera:
Copyright 2000, Microsoft Inc. Todos los derechos reservados.
Para cargarlo, debe desactivar el atributo validarOnParse de la interfaz IXMLDOMDocument. Intente pegarlo en la página de prueba del validador, desactive la validación de DTD y haga clic en Validar. Observe que el documento se carga y los caracteres de copyright aparecen en el árbol DOM al final de la página del validador.
Si se ha completado la validación de la DTD, las entidades HTML que son entidades de parámetros deben incluirse en la DTD existente de la siguiente manera:
%HTMLENT;
%HTMLENT;
Definirá todas las entidades HTML para que puedan usarse en documentos XML.
¿Cómo lidiar con los espacios en blanco en el contenido del elemento?
XML DOM tiene tres formas de acceder al contenido textual de los elementos:
Atributo Comportamiento
nodeValue Devuelve el contenido textual original (incluidos los espacios en blanco) en los nodos TEXTO, CDATA, COMMENT y PI tal como se especifica en la fuente XML original. Para los nodos ELEMENT y el propio DOCUMENT, se devuelve nulo.
Datos Igual que nodeValue
La repetición de texto concatena múltiples nodos TEXTO y CDATA en el subárbol especificado y devuelve el resultado combinado.
Nota: Los caracteres de espacio en blanco incluyen nuevas líneas, tabulaciones y espacios.
La propiedad nodeValue normalmente devuelve el contenido del documento original, independientemente de cómo se cargó el documento y del alcance xml:space actual.
El atributo de texto concatena todo el texto en el subárbol especificado y extiende la entidad. Esto está relacionado con cómo se carga el documento, el estado actual del modificador preserveWhiteSpace y el alcance xml:space actual; consulte a continuación:
preserveWhiteSpace = true cuando se carga el documento
preserveWhiteSpace=true | preserveWhiteSpace=true | preserveWhiteSpace=false | preserveWhiteSpace=false |
xml:space=preserve | xml:space=default | xml:space=preserve | xml:space=default |
preserve | preserve | preserve | preserve y trunque |
preserveWhiteSpace = false cuando se carga el documento
preserveWhiteSpace=true | preserveWhiteSpace=true | preserveWhiteSpace=false preserveWhiteSpace= | false |
xml:space=preserve | xml:space=default | xml:space=preserve | xml:space=predeterminado |
preservar a la mitad | conservar a la mitad y truncar | preservar a la mitad | preservar a la mitad y truncar |
aquí significa y exactamente el mismo contenido de texto original en el documento XML original, se han eliminado los espacios en blanco iniciales y finales del significado truncado, se conservan los "caracteres de espacios en blanco importantes" que significan semiconservados y se normalizan los "caracteres de espacios en blanco sin importancia". Los espacios en blanco importantes son caracteres de espacio en blanco dentro del contenido del texto. Los espacios en blanco sin importancia son los espacios en blanco entre tokens, tienen este aspecto:
n
tJanen
tSmith n
En este ejemplo, el rojo es un carácter de espacio en blanco sin importancia que se puede ignorar, mientras que el verde es un carácter de espacio en blanco importante porque forma parte del contenido del texto y, por lo tanto, tiene un significado importante que no se puede ignorar. Entonces, en este ejemplo, la propiedad de texto devuelve lo siguiente:
El valor de retorno del estado sigue siendo "nt JanentSmith n"
Mantener y truncar "JanentSmith"
"Jane Smith" semi-reservada
Conservar a la mitad y truncar "Jane Smith"
Tenga en cuenta que "conservar a la mitad" normalizará los espacios en blanco sin importancia; por ejemplo, los caracteres de nueva línea y tabulación se reducirán a un solo espacio. Si cambia el atributo xml:space y preserva el interruptor WhiteSpace, las propiedades del texto devolverán valores correspondientemente diferentes.
CDATA y xml:space="preservar" límites de subárbol
En el siguiente ejemplo, el contenido de los nodos CDATA o nodos "reservados" se concatenarán porque no participan en la normalización de caracteres de espacios en blanco sin importancia. Por ejemplo:
norte
tJanen
t Smith ]>n
En este caso, los caracteres de espacio en blanco dentro del nodo CDATA ya no se "fusionan" con caracteres de espacio en blanco "sin importancia" y no se truncan. Por lo tanto, el caso "medio conservado y truncado" devolverá lo siguiente:
"Jane Smith"
Aquí, se incluirán espacios en blanco sin importancia entre las etiquetas y, independientemente del contenido del nodo CDATA. Si reemplaza CDATA con lo siguiente, se devolverá el mismo resultado:
Smith
Las entidades son entidades especiales
que se cargan y analizan como parte de la DTD y se muestran en el nodo DOCTYPE. No es necesario que tengan ningún alcance xml:space. Por ejemplo:
Janen
Tennesse
">
]>
&Jane;
Suponiendo que preserveWhiteSpace=false (en el alcance de la etiqueta DOCTYPE), los espacios en blanco sin importancia se pierden al analizar entidades. Las entidades no tendrán nodos de caracteres de espacios en blanco. El árbol se verá así:
DOCTYPE foo
ENTIDAD: Jane
ELEMENTO: empleado
ELEMENTO: nombre
TEXTO: Jane
ELEMENTO: título
TEXTO>:Ingeniero de Diseño de Software
ELEMENTO: foo
ATRIBUTO: xml:espacio="preservar"
REFENTIDAD: Jane
Tenga en cuenta que el árbol DOM expuesto bajo el nodo ENTITY dentro de DOCTYPE no contiene ningún nodo WHITESPACE. Esto significa que los nodos secundarios del nodo ENTITYREF tampoco tienen nodos WHITESPACE, incluso si la referencia de la entidad está dentro del alcance de xml:space="preserve".
Cada instancia de ENTIDAD a la que se hace referencia en un documento determinado suele tener el mismo árbol.
Si una entidad debe preservar absolutamente los caracteres de espacio en blanco, entonces debe especificar su propio atributo xml:space internamente, o el modificador document preserveWhiteSpace debe establecerse en verdadero.
¿Cómo lidiar con los espacios en blanco en los atributos?
Hay varias formas de acceder a los valores de las propiedades. La interfaz IXMLDOMAttribute tiene un atributo nodeValue, que es equivalente a los atributos nodeValue y text como una extensión de Microsoft. Estas propiedades devuelven: El texto devuelto por la propiedad.
attrNode.nodeValue
attrNode.valor
getAttribute("nombre") devuelve exactamente el mismo contenido (y entidades extendidas) que en el documento original.
attrNode.nodeTypedValue Nulo
attrNode.text es igual que nodeValue excepto que los espacios en blanco iniciales y finales se han truncado.
La especificación "Lenguaje XML" define el siguiente comportamiento para aplicaciones XML: Tipos de atributos Texto devuelto ID CDATA, IDREF, IDREFS, ENTIDAD, ENTIDADES, NOTACIÓN, enumeración
Seminormalización Normalización completa
Aquí la seminormalización representa la conversión de nuevas líneas y caracteres de tabulación es un espacio, pero varios espacios no degenerarán en un solo espacio.