Muito semelhante a esta questão , exceto para Java.
Qual é a maneira recomendada de codificar strings para uma saída XML em Java. As strings podem conter caracteres como "&", "<", etc.
Muito semelhante a esta questão , exceto para Java.
Qual é a maneira recomendada de codificar strings para uma saída XML em Java. As strings podem conter caracteres como "&", "<", etc.
Muito simplesmente: use uma biblioteca XML. Dessa forma, será realmente correto em vez de exigir conhecimento detalhado de bits da especificação XML.
Como outros mencionaram, usar uma biblioteca XML é a maneira mais fácil. Se você quiser escapar-se, você pode olhar para
StringEscapeUtils
a partir do Apache Commons Lang biblioteca.fonte
StringEscapeUtils.escapeXml(str)
decommons-lang
. Eu o uso no aplicativo App Engine - funciona perfeitamente. Aqui está o Java Doc para esta função:\t
,\n
e\r
.\t
,\n
ou\r
precisa ser escapado?Apenas use.
Isso permitirá qualquer caractere, exceto o final
Portanto, você pode incluir caracteres que seriam ilegais, como & e>. Por exemplo.
No entanto, os atributos precisarão ser escapados, pois os blocos CDATA não podem ser usados para eles.
fonte
Isso funcionou bem para mim fornecer uma versão com escape de uma string de texto:
fonte
Experimente isto:
fonte
t==null
.Esta pergunta tem oito anos e ainda não é uma resposta totalmente correta! Não, você não deve ter que importar uma API de terceiros inteira para fazer esta tarefa simples. Mau conselho.
O seguinte método irá:
Tentei otimizar para o caso mais comum, enquanto ainda garantindo que você poderia canalizar / dev / random por meio disso e obter uma string válida em XML.
Edit: para aqueles que continuam a insistir que é tolice escrever seu próprio código para isso quando há APIs Java perfeitamente boas para lidar com XML, você pode gostar de saber que a API StAX incluída no Oracle Java 8 (eu não testei outras ) falha ao codificar o conteúdo CDATA corretamente: não escapa]]> sequências no conteúdo. Uma biblioteca de terceiros, mesmo que seja parte do núcleo do Java, nem sempre é a melhor opção.
fonte
StringEscapeUtils.escapeXml()
não escapa caracteres de controle (<0x20). XML 1.1 permite caracteres de controle; XML 1.0 não. Por exemplo,XStream.toXML()
serializará alegremente os caracteres de controle de um objeto Java em XML, que um analisador XML 1.0 rejeitará.Para escapar de caracteres de controle com Apache commons-lang, use
fonte
fonte
replaceAll
chamadas é muito ineficiente, especialmente para strings grandes. Cada chamada resulta na criação de um novo objeto String, que ficará parado até que o lixo seja coletado. Além disso, cada chamada requer um loop pela string novamente. Isso poderia ser consolidado em um único loop manual com comparações contra cada caractere de destino em cada iteração.Enquanto o idealismo diz para usar uma biblioteca XML, IMHO, se você tem uma ideia básica de XML, o bom senso e o desempenho dizem que é um modelo completo. É indiscutivelmente mais legível também. Embora usar as rotinas de escape de uma biblioteca seja provavelmente uma boa ideia.
Considere o seguinte: XML foi feito para ser escrito por humanos.
Use bibliotecas para gerar XML quando tiver seu XML como um "objeto" modelar melhor seu problema. Por exemplo, se os módulos conectáveis participarem do processo de construção deste XML.
Editar: quanto a como realmente escapar XML em modelos, o uso de CDATA ou
escapeXml(string)
de JSTL são duas boas soluções,escapeXml(string)
podem ser usadas assim:fonte
O comportamento de StringEscapeUtils.escapeXml () foi alterado de Commons Lang 2.5 para 3.0. Agora ele não escapa mais caracteres Unicode maiores que 0x7f.
Isso é uma coisa boa, o método antigo era estar um pouco ansioso para escapar de entidades que poderiam apenas ser inseridas em um documento utf8.
Os novos escapers a serem incluídos no Google Guava 11.0 também parecem promissores: http://code.google.com/p/guava-libraries/issues/detail?id=799
fonte
Para aqueles que procuram a solução mais rápida de escrever: use os métodos do apache commons-lang :
StringEscapeUtils.escapeXml10()
para xml 1.0StringEscapeUtils.escapeXml11()
para xml 1.1StringEscapeUtils.escapeXml()
agora está obsoleto, mas era comumente usado no passadoLembre-se de incluir dependência:
fonte
Observação: sua pergunta é sobre como escapar , não sobre a codificação . Escaping está usando <, etc. para permitir que o analisador distinga entre "este é um comando XML" e "este é um texto". Codificação é o que você especifica no cabeçalho XML (UTF-8, ISO-8859-1, etc).
Em primeiro lugar, como todo mundo disse, use uma biblioteca XML. XML parece simples, mas o material de codificação + escape é vodu escuro (que você notará assim que encontrar tremas e japonês e outras coisas estranhas como " dígitos de largura total " (& # FF11; é 1)). Manter o XML legível por humanos é uma tarefa de Sísifo.
Eu sugiro que nunca tente ser inteligente sobre codificação de texto e escape em XML. Mas não deixe que isso o impeça de tentar; apenas lembre-se de quando ele te morde (e vai).
Dito isso, se você usar apenas UTF-8, para tornar as coisas mais legíveis, você pode considerar esta estratégia:
<![CDATA[ ... ]]>
Estou usando isso em um editor de SQL e permite que os desenvolvedores recortem e colem SQL de uma ferramenta SQL de terceiros no XML sem se preocupar em escapar. Isso funciona porque o SQL não pode conter tremas no nosso caso, então estou seguro.
fonte
Embora concorde com Jon Skeet em princípio, às vezes não tenho a opção de usar uma biblioteca XML externa. E acho peculiar que as duas funções para escapar / unescape um valor simples (atributo ou tag, não documento completo) não estão disponíveis nas bibliotecas XML padrão incluídas com Java.
Como resultado e com base nas diferentes respostas que vi postadas aqui e em outros lugares, aqui está a solução que acabei criando (nada funcionou como um simples copiar / colar):
O acima acomoda várias coisas diferentes:
Em algum momento, escreverei a inversão dessa função, toUnescaped (). Eu simplesmente não tenho tempo para fazer isso hoje. Quando eu fizer isso, irei atualizar esta resposta com o código. :)
fonte
Para escapar de caracteres XML, a maneira mais fácil é usar o projeto Apache Commons Lang, JAR disponível para download em: http://commons.apache.org/lang/
A classe é esta: org.apache.commons.lang3.StringEscapeUtils;
Ele tem um método chamado "escapeXml", que retornará uma String com escape apropriado.
fonte
Se você está procurando uma biblioteca para fazer o trabalho, tente:
Guava 26.0 documentado aqui
return XmlEscapers.xmlContentEscaper().escape(text);
Apache Commons Text 1.4 documentado aqui
StringEscapeUtils.escapeXml11(text)
fonte
Esta é uma solução fácil e ótima para codificar caracteres acentuados também!
Saídas
fonte
Você pode usar a biblioteca Enterprise Security API (ESAPI) , que fornece métodos como
encodeForXML
eencodeForXMLAttribute
. Dê uma olhada na documentação da interface do codificador ; ele também contém exemplos de como criar uma instância de DefaultEncoder .fonte
Apenas substitua
E para outros personagens:
fonte
Use JAXP e esqueça o tratamento de texto, isso será feito para você automaticamente.
fonte
Tente codificar o XML usando o serializador Apache XML
fonte
Aqui está o que descobri depois de pesquisar em todos os lugares em busca de uma solução:
Obtenha a biblioteca Jsoup:
Então:
Espero que isso ajude alguém
fonte