Autor: AngelGavin Fonte: CSDN
Como carregar documentos com caracteres estrangeiros e especiais?
Os documentos podem conter caracteres estrangeiros, como:
caracteres estrangeiros (úóí?)
Por exemplo, caracteres estrangeiros como 粲 devem ser precedidos por uma sequência de escape. Os caracteres estrangeiros podem ser codificados em UTF-8 ou especificados com uma codificação diferente, como segue:
caracteres estrangeiros (?磲)
O XML agora está carregado corretamente.
Outros caracteres são reservados em XML e precisam ser tratados de forma diferente. XML abaixo:
Isso e aquilo
Ocorre o seguinte erro:
Não são permitidos espaços aqui.
Linha 0000001: Isto e aquilo
Localização 0000012: ----------^
Aqui, & faz parte da estrutura de sintaxe XML. Se for colocado apenas dentro da fonte de dados XML, não poderá ser interpretado como &. Você precisa substituir sequências de caracteres especiais chamadas "entidades".
Isso e aquilo
Os seguintes caracteres requerem entidades correspondentes:
<<
& &
>>
" "
''
O caractere de aspas é usado como delimitador para valores de atributos na marcação e, portanto, geralmente não pode ser usado dentro de valores de atributos. Por exemplo, o seguinte retornará um erro:
As aspas simples aqui são usadas como delimitador de atributo e dentro do próprio valor do atributo. Para corrigir esse problema, você pode alterar o delimitador do atributo para aspas duplas:
ou pode escapar das aspas simples para a entidade.
Ambos os métodos acima retornarão o valor do atributo John's Stuff por meio do método getAttribute no modelo de objeto XML. Da mesma forma, para aspas duplas você pode usar a entidade ".
Você também pode manipular caracteres especiais no conteúdo do elemento colocando o texto em uma seção CDATA. O seguinte está correto:
Neste exemplo, o modelo de objeto XML exibe o nó CDATA como um nó filho do nó xml, que retorna a string
This & that é apenas conteúdo de "texto".
como nodeValue.
Como usar o componente MSXML COM no Visual Studio 6.0 C++?
A maneira mais fácil de usar componentes MSXML COM no Visual C++ 6.0 é usar a diretiva #import:
#import "msxml.dll" nomeado_guids no_namespace#import "msxml.dll" nomeado_guids no_namespace
Ele define todas as interfaces e IDs de interface IXML* para que possam ser usados em aplicativos. A biblioteca de tipos MSXML e os arquivos de cabeçalho (em inglês) também estão disponíveis no INETSDK, bem como uuid.lib contendo IIDs de classe.
Como usar entidades HTML em XML?
O seguinte XML contém entidades HTML:
Direitos autorais? 2000, Microsoft Inc, Todos os direitos reservados.
Produz o seguinte erro:
Referência à entidade indefinida 'cópia'.
Linha: 1, Posição: 23, Código de erro: 0xC00CE002
Direitos autorais? 2000, ...
-----------------------^
Isso ocorre porque o XML possui apenas cinco entidades integradas. Para obter mais informações sobre entidades integradas, consulte Como carrego documentos com caracteres estrangeiros e especiais? .
Para usar entidades HTML, você precisa defini-las com um DTD. Para obter mais informações sobre DTDs, consulte as Recomendações XML do W3C (em inglês). Para utilizar esta DTD, inclua-a diretamente na tag DOCTYPE, conforme segue:
Direitos autorais? 2000, Microsoft Inc, Todos os direitos reservados.
Para carregá-lo, é necessário desativar o atributo validOnParse da interface IXMLDOMDocument. Tente colá-lo na página de teste do validador, desative a validação DTD e clique em Validar. Observe que o documento é carregado e os caracteres de copyright aparecem na árvore DOM no final da página do validador.
Se a validação do DTD tiver sido concluída, as entidades HTML que são entidades de parâmetro deverão ser incluídas no DTD existente da seguinte forma:
%HTMLENT;
%HTMLENT;
Ele definirá todas as entidades HTML para que possam ser utilizadas em documentos XML.
Como lidar com caracteres de espaço em branco no conteúdo do elemento?
O XML DOM possui três maneiras de acessar o conteúdo textual dos elementos:
Atributo Comportamento
nodeValue Retorna o conteúdo textual original (incluindo caracteres de espaço em branco) nos nós TEXT, CDATA, COMMENT e PI conforme especificado na fonte XML original. Para nós ELEMENT e para o próprio DOCUMENT, null é retornado.
Dados iguais a nodeValue
Text Repeat concatena vários nós TEXT e CDATA na subárvore especificada e retorna o resultado combinado.
Nota: Os caracteres de espaço em branco incluem novas linhas, tabulações e espaços.
A propriedade nodeValue geralmente retorna o conteúdo do documento original, independentemente de como o documento foi carregado e do escopo xml:space atual.
O atributo text concatena todo o texto na subárvore especificada e estende a entidade. Isso está relacionado a como o documento é carregado, ao estado atual da opção preserveWhiteSpace e ao escopo xml:space atual, veja abaixo:
preserveWhiteSpace = true quando o documento é carregado
preserveWhiteSpace=true | preserveWhiteSpace=true | preserveWhiteSpace=false | preserveWhiteSpace=false |
xml:space=preserve | xml:space=default | xml:space=preserve | xml:space=default |
preserve | preserve | preserve | preserve e truncar |
preserveWhiteSpace = false quando o documento é carregado
preserveWhiteSpace=true | preserveWhiteSpace=true | preserveWhiteSpace=false preserveWhiteSpace= | false |
xml:space=preserve | xml:space=default | xml:space=preserve | xml:space=default |
meio-preservar | meio-preservar e truncar | meio-preservar | meio-preservar e truncar |
preservar aqui significa e exatamente o mesmo conteúdo de texto original no documento XML original, truncado, significando que os espaços em branco à esquerda e à direita foram removidos, semi-preservado, o que significa que "caracteres de espaço em branco significativos" são preservados e "caracteres de espaço em branco sem importância" são normalizados. Caracteres de espaço em branco importantes são caracteres de espaço em branco no conteúdo do texto. Caracteres de espaço em branco sem importância são os caracteres de espaço em branco entre tokens, parecidos com isto:
n
tJanen
tSmith n
Neste exemplo, o vermelho é um caractere de espaço em branco sem importância que pode ser ignorado, enquanto o verde é um caractere de espaço em branco importante porque faz parte do conteúdo do texto e, portanto, tem um significado importante que não pode ser ignorado. Portanto, neste exemplo, a propriedade text retorna o seguinte:
O valor de retorno do status permanece "nt JanentSmith n"
Mantenha e trunque "JanentSmith"
Semi-reservada "Jane Smith"
Preservar pela metade e truncar "Jane Smith"
Observe que "preservar pela metade" normalizará caracteres de espaço em branco sem importância, por exemplo, caracteres de nova linha e tabulação serão reduzidos a um único espaço. Se você alterar o atributo xml:space e a opção preserveWhiteSpace, as propriedades de texto retornarão valores correspondentemente diferentes.
Limites de subárvore CDATA e xml:space="preserve"
No exemplo a seguir, o conteúdo dos nós CDATA ou nós "reservados" será concatenado porque não participa da normalização de caracteres de espaço em branco sem importância. Por exemplo:
n
tJane n
tSmith ]>n
Nesse caso, os caracteres de espaço em branco dentro do nó CDATA não são mais "mesclados" com caracteres de espaço em branco "sem importância" e não são truncados. Portanto, o caso "meio preservado e truncado" retornará o seguinte:
"Jane Smith"
Aqui, caracteres de espaço em branco sem importância entre as tags e serão incluídos, independentemente do conteúdo do nó CDATA. Se você substituir CDATA pelo seguinte, o mesmo resultado será retornado:
Smith
Entidades são entidades especiais
que são carregadas e analisadas como parte do DTD e exibidas no nó DOCTYPE. Eles não precisam ter nenhum escopo xml:space. Por exemplo:
Janen
tn
">
]>
&Jane;
Assumindo preserveWhiteSpace=false (no escopo da tag DOCTYPE), caracteres de espaço em branco sem importância são perdidos ao analisar entidades. As entidades não terão nós de caracteres de espaço em branco. A árvore ficará assim:
DOCTYPE foo
ENTIDADE: Jane
ELEMENTO: funcionário
ELEMENTO: nome
TEXTO: Jane
ELEMENTO: título
TEXTO>:Engenheiro de Design de Software
ELEMENTO: foo
ATRIBUTO: xml:space="preserve"
ENTIDADEREF: Jane
Observe que a árvore DOM exposta no nó ENTITY dentro do DOCTYPE não contém nenhum nó WHITESPACE. Isso significa que os nós filhos do nó ENTITYREF também não possuem nós WHITESPACE, mesmo que a referência da entidade esteja dentro do escopo de xml:space="preserve".
Cada instância de ENTITY referenciada em um determinado documento geralmente possui a mesma árvore.
Se uma entidade precisar preservar absolutamente os caracteres de espaço em branco, ela deverá especificar seu próprio atributo xml:space internamente ou a opção document preserveWhiteSpace deverá ser definida como true.
Como lidar com caracteres de espaço em branco em atributos?
Existem várias maneiras de acessar valores de propriedade. A interface IXMLDOMAttribute possui um atributo nodeValue, que é equivalente aos atributos nodeValue e text como uma extensão da Microsoft. Essas propriedades retornam: O texto retornado pela propriedade
attrNode.nodeValue
attrNode.value
getAttribute("name") retorna exatamente o mesmo conteúdo (e entidades estendidas) do documento original.
attrNode.nodeTypedValue Nulo
attrNode.text é igual a nodeValue, exceto que os caracteres de espaço em branco iniciais e finais foram truncados.
A especificação "Linguagem XML" define o seguinte comportamento para aplicações XML: Tipos de atributos Texto retornado CDATA ID, IDREF, IDREFS, ENTITY, ENTITIES, NOTATION, enumeração
Semi-normalização Normalização completa
Aqui a semi-normalização representa a conversão de novas linhas e caracteres de tabulação é um espaço, mas vários espaços não degenerarão em um espaço.