caracteres especiais em arquivos XML - processamento com a API DOM
-
22-08-2019 - |
Pergunta
Eu tenho um arquivo que está no formato XML (consiste apenas de início de raiz e tags de fim, e filhos da raiz). Os elementos de texto das crianças conter o símbolo E comercial &. Em XML que não é permitido ter este símbolo a fim o documento seja válido, e quando eu tentava processar o arquivo usando a API DOM em Java e um analisador XML, obtive erros de análise. Portanto, tenho substituído e com &
, e eu processado o arquivo com sucesso: Eu tive que extrair os valores dos elementos de texto em diferentes arquivos de texto simples.
Quando abri esses arquivos de texto recém-criado, eu esperava ver &
, mas não havia e em vez disso. Por que é isso? Tenho guardado o texto em arquivos de texto sem qualquer extensão (meu arquivo original com o formato XML também não têm extensão .xml), e eu tenho apenas e no texto do novo arquivo, não importa como eu abrir o arquivo: como txt ou como arquivo xml (estas são algumas das opções no meu editor XML). O que acontece exatamente? Does Java (?) Convertido &
a & automaticamente? Ou há alguma codificação padrão? Bem, &
significa &, e suponho que há alguma conversão automática "invisível", mas eu estou confuso quando e como isso acontece. Aqui estão exemplos de meu arquivo original eo arquivo extraído que eu recebo depois de processado o arquivo original com Java:
Este é meu arquivo "negative.review" em formato XML:
<review>
<review_text>
I will not wear it as it is too big & looks funny on me.
</review_text>
</review>
Este é meu arquivo extraído "negative_1":
I will not wear it as it is too big & looks funny on me.
Para mim é importante ter os dados originais como está (sem fazer quaisquer conversões / substituições), então eu pensei que eu tenho que processar o arquivo extraído "negative_1" converter de volta &
para &. Como você vê, parece que eu não tenho que fazer isso. Mas eu não entendo por que :(.
Agradecemos antecipadamente!
Solução
A razão é simples: O arquivo XML realmente contém um caráter "&"
É apenas representado de forma diferente (ou seja, ele é "escapou"), porque uma verdadeira "&"
, por si própria arquivos breaks XML, como você viu. Leia a seção relevante no XML 1.0 especificação: "2,4 Character Data e Markup" . É apenas algumas linhas, mas explica a questão muito bem.
XML é uma representação de dados (!). Não pense nisso como um arquivo de texto. Exemplo:
Você deseja armazenar a string "17 <20" em um arquivo XML. Inicialmente, você não pode, uma vez que o "<" é reservado como o suporte tag de abertura. Portanto, este seria inválido:
<xml>17 < 20</xml>
Solução: Você caráter empregam escapar na / caractere especial reservado, apenas para os meios de reter a validade do arquivo:
<xml>17 < 20</xml>
Para todos os efeitos práticos, o fragmento acima contém os seguintes dados (na representação JSON este tempo):
{
"xml": "17 < 20"
}
É por isso que você vê o "&"
real em sua pós-processamento. Ela havia sido escapou em exatamente da mesma maneira, mas é significa permaneceu o mesmo o tempo todo.
O exemplo acima também explica por que o "&"
devem ser tratados de maneira especial: É a própria parte do mecanismo de fuga XML. Ele marca o início de uma sequência de escape, como em "<"
. Por isso, deve ser escapado em si (com "&"
, como você fez).
Outras dicas
Qualquer parser XML irá traduzir implicitamente entidades como &
, <
, >
, para os personagens correspondentes, como parte do processo de análise do arquivo.