Como os caracteres de espaço em branco são tratados no modelo de objeto XML?
Às vezes, o modelo de objeto XML exibirá nós TEXT que contêm caracteres de espaço em branco. Quando os caracteres de espaço em branco são truncados, é provável que cause alguma confusão. Por exemplo, o seguinte exemplo XML:
]>
Smith
John
A seguinte árvore é gerada:
Instrução de processamento: xml
Tipo de documento: pessoa
ELEMENTO: pessoa
TEXTO:
ELEMENTO: sobrenome
TEXTO:
ELEMENTO: nome
TEXTO:
O nome e o sobrenome são cercados por nós TEXT contendo apenas caracteres de espaço em branco porque o modelo de conteúdo do elemento "pessoa" é MIXED; O modelo de conteúdo MIXED especifica que pode existir texto entre os elementos. Portanto, o seguinte também está correto:
Meu sobrenome é Smith e meu primeiro nome é
John
O resultado é uma árvore semelhante à seguinte:
ELEMENTO: pessoa
TEXTO: Meu sobrenome é
ELEMENTO: sobrenome
TEXTO: e meu primeiro nome é
ELEMENTO: nome
TEXTO:
Sem os caracteres de espaço em branco antes e depois da palavra "é" e os caracteres de espaço em branco depois e antes da palavra "e", a frase seria ininteligível. Portanto, para o modelo de conteúdo MIXED, combinações de texto, caracteres de espaço em branco e elementos são todos relevantes. Este não é o caso dos modelos de conteúdo não MISTOS.
Para fazer com que os nós TEXT somente com espaços em branco desapareçam, remova a palavra-chave #PCDATA da declaração do elemento "person":
o resultado é a seguinte árvore clara:
Instrução de processamento: xml
Tipo de documento: pessoa
ELEMENTO: pessoa
ELEMENTO: sobrenome
ELEMENT: firstname
O que a declaração XML faz?
A declaração XML deve ser listada no topo do documento XML:
ela especifica os seguintes itens:
O documento é um documento XML. Os detectores MIME podem usar isso para detectar se um arquivo é do tipo text/xml quando o tipo MIME está ausente ou não foi especificado.
O documento está em conformidade com a especificação XML 1.0. Isto será importante no futuro, quando existirem outras versões de XML.
Codificação de caracteres do documento. O atributo de codificação é opcional e o padrão é UTF-8.
Nota: A declaração XML deve estar na primeira linha do documento XML, portanto o seguinte arquivo XML:
produz o seguinte erro de análise:
Declaração xml inválida.
Linha 0000002:
Localização 0000007: ------^
Nota: a declaração XML é opcional. Se você precisar especificar comentários ou instruções de processamento no topo, não coloque uma declaração XML. No entanto, a codificação padrão será UTF-8.
Como imprimo meu documento XML em um formato legível?
Ao construir um documento do zero usando o DOM para produzir um arquivo XML, tudo fica em uma linha, sem espaços entre eles. Este é o comportamento padrão.
Constrói a folha de estilo XSL padrão no Internet Explorer 5 para exibir e imprimir documentos XML em um formato legível. Por exemplo, se o IE5 já estiver instalado, tente consultar o arquivo nospace.xml. A seguinte árvore deve aparecer no navegador:
-
-
XYZ
12.56
Nenhum caractere de espaço em branco inserido no XML.
Imprimir XML legível é muito interessante, principalmente quando existem DTDs que definem diferentes tipos de modelos de conteúdo. Por exemplo, no modelo de conteúdo misto (#PCDATA) você não pode inserir espaços porque isso pode alterar o significado do conteúdo. Por exemplo, considere o seguinte XML:
Elefante
É melhor não produzir como:
E
lefante
Porque os limites das palavras não estão mais corretos.
Tudo isso torna a impressão automatizada problemática. Se não precisar imprimir XML legível, você poderá usar o DOM para inserir caracteres de espaço em branco como nós de texto em locais apropriados.
Como usar namespaces no DTD? Para utilizar um namespace em uma DTD, declare-o na declaração ATTLIST do elemento que o utiliza, conforme a seguir:
O tipo de namespace deve ser #FIXED. O mesmo vale para namespaces de atributos:
namespaces e esquemas XML DTDs e esquemas XML não podem ser misturados. Por exemplo, o seguinte
xmlns:x CDATA #FIXED "x-schema:myschema.xml"
Não fará com que a definição de esquema definida em myschema.xml seja usada. O uso de esquemas DTD e XML são mutuamente exclusivos.
Como usar XMLDSO em Visual Basic?
Use o seguinte XML como exemplo:
Marcos Hanson
206 765 4583
Jane Smith
425 808 1111
Você pode vincular a um conjunto de registros ADO da seguinte maneira:
Crie um novo projeto VB 6.0.
Adicione referências ao Microsoft ActiveX Data Objects 2.1 ou posterior, Microsoft Data Adapter Library e Microsoft XML versão 2.0.
Use o código a seguir para carregar dados XML no controle XML DSO:
Dim dso como novo XMLDSOControl
Dim documento como IXMLDOMDocument
Definir doc = dso.XMLDocument
doc.Load ("d:test.xml")
usa o seguinte código para mapear o DSO em um novo objeto de conjunto de registros usando o DataAdapter:
Dim da As New DataAdapter
Definir da.Object = dso
Dim rs como novo ADODB.Recordset
Definir rs.DataSource = da
Dados de acesso:
MsgBox rs.Fields("nome").Value
resulta na string "Mark Hanson"
Como usar XML DOM em Java?
A versão IE5 do MSXML.DLL deve estar instalada. No Visual J++ 6.0, selecione Adicionar wrapper COM no menu Projeto e selecione "Microsoft XML 1.0" na lista de objetos COM. Isto construirá o wrapper Java necessário em um novo pacote chamado "msxml". Esses wrappers Java pré-construídos também estão disponíveis para download. As aulas podem ser usadas da seguinte forma:
importar com.ms.com.*;
importar msxml.*;
classe pública Classe1
{
público estático void principal (String[] args)
{
DOMDocument doc = new DOMDocument();
doc.load(nova Variante(" arquivo://d:/samples/ot.xml "));
System.out.println("Carregado " + doc.getDocumentElement().getNodeName());
}
}
O exemplo de código carregará o arquivo de teste de 3,8 MB "ot.xml" do exemplo da religião do sol. A classe Variant agrupa o tipo básico Win32 VARIANT.
Como na verdade você obtém um novo wrapper sempre que recupera um nó, não é possível usar comparações de ponteiros em nós. Portanto, não use o código abaixo,
IXMLDOMNode root1 = doc.getDocumentElement();
IXMLDOMNode root2 = doc.getDocumentElement();
se (raiz1 == raiz2)...
Em vez disso, use o seguinte código:
if (ComLib.isEqualUnknown(root1, root2)) ....
O tamanho total do wrapper .class é de aproximadamente 160 KB. No entanto, para total conformidade com a especificação W3C, apenas wrappers IXMLDOM* devem ser usados. As seguintes classes são interfaces XML antigas do IE 4.0 e podem ser removidas da pasta msxml:
Atributo IXML*,
IXMLDocument*, XMLDocument*
Elemento IXML*,
IXMLError*,
IXMLElementCollection*,
etiquetaXMLEMEM_TYPE*
_xml_erro*
Isso reduz o tamanho para 147 KB. Você também pode excluir os seguintes itens:
Documento DOMFreeThreaded
Acesse documentos XML de vários threads em aplicativos Java.
Solicitação XMLHttp
Use a extensão XML DAV HTTP para se comunicar com o servidor.
Tempo de execução IXTLR
Defina o objeto de script da folha de estilo XSL.
Controle XMLDSO
Vincula-se a dados XML em uma página HTML.
XMLDOMDocumentEvents
Retorno de chamada durante a análise.
Isso reduz o tamanho para 116 KB. Para torná-lo ainda menor, considere o fato de que o próprio DOM possui duas camadas: a camada central consiste em:
DOMDocument, IXMLDOMDocument
Nó IXMLDOM*
IXMLDOMNodeList*
IXMLDOMNamedNodeMap*
IXMLDOMDocumentFragment*
Implementação IXMLDOMI
IXMLDOMParseError
E informações de DTD que os usuários podem precisar reter:
IXMLDOMDocumentType
IXMLDOMEntidade
Notação IXMLDOM
Todos os tipos de nós em um documento XML são IXMLDOMNodes, que fornecem funcionalidade completa, mas existem wrappers de nível superior para cada tipo de nó. Portanto, se você modificar o wrapper DOMDocument e alterar esses tipos específicos para usar IXMLDOMNode, todas as interfaces a seguir poderão ser removidas:
Atributo IXMLDOM
Seção IXMLDOMCDATA
IXMLDOMCharacterData
Comentário IXMLDOM
Elemento IXMLDOM
Instrução de Processamento IXMLDOM
Referência IXMLDOMEntity
IXMLDOMTexto
Removê-los reduzirá o tamanho para 61 KB. No entanto, para IXMLDOMElement, os métodos getAttribute e setAttribute são úteis. Caso contrário, você precisará usar:
IXMLDOMNode.getAttributes().setNamedItem(...)