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 &amp; 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 &amp; para &. Como você vê, parece que eu não tenho que fazer isso. Mas eu não entendo por que :(.

Agradecemos antecipadamente!

Foi útil?

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 &lt; 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 "&lt;". Por isso, deve ser escapado em si (com "&amp;", como você fez).

Outras dicas

Qualquer parser XML irá traduzir implicitamente entidades como &amp;, &lt;, &gt;, para os personagens correspondentes, como parte do processo de análise do arquivo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top