Pergunta

Ao carregar XML em um Xmldocument, ou seja,

XmlDocument document = new XmlDocument();
document.LoadXml(xmlData);

Existe alguma maneira de impedir que o processo substitua as entidades? Eu tenho um problema estranho em que tenho um símbolo da TM (armazenado como a entidade #8482) no XML sendo convertido no caractere da TM. No que me diz respeito, isso não deve acontecer, pois o documento XML tem o ISO-8859-1 de codificação (que não possui o símbolo da MT)

Obrigado

Foi útil?

Solução

Este é um mal -entendido padrão do conjunto de ferramentas XML. Todo o negócio com "&#x", é um recurso sintático projetado para lidar com as codificações de caracteres. Seu XMLDocument não é um fluxo de caracteres - ele foi libertado de problemas de codificação de caracteres -, em vez disso, contém um modelo abstrato de dados do tipo XML. Palavras para isso incluem DOM e Infoset, não tenho certeza exatamente qual é preciso.

Os Gubbins "&#x" não existirão neste modelo porque todo o problema é irrelevante, ele retornará - se apropriado - quando você transformar as informações definidas em um fluxo de caracteres em alguma codificação específica.

Esse mal -entendido é suficientemente comum para transformar isso na literatura acadêmica como parte de uma coleção de peculiaridades semelhantes. Dê uma olhada em "XML Fever" neste local: http://doi.acm.org/10.1145/1364782.1364795

Outras dicas

Para que você está escrevendo? Um textwriter? um fluxo? que?

A seguir, mantém a entidade (bem, ela a substitui pelo equivalente hexadecimal) - mas se você fizer o mesmo com um stringwriter, ele detecta o unicode e o usará: Em vez disso, em vez disso:

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(@"<xml>&#8482;</xml>");
    using (MemoryStream ms = new MemoryStream())
    {
        XmlWriterSettings settings = new  XmlWriterSettings();
        settings.Encoding = Encoding.GetEncoding("ISO-8859-1");
        XmlWriter xw = XmlWriter.Create(ms, settings);
        doc.Save(xw);
        xw.Close();
        Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
    }

Saídas:

    <?xml version="1.0" encoding="iso-8859-1"?><xml>&#x2122;</xml>

Confesso que as coisas ficam um pouco confusas com documentos e codificações XML, mas espero que seja definido apropriado quando você o salvar novamente, se você ainda estiver usando ISO-8859-1-mas se você salvar com UTF- 8, não precisaria. De certa forma, logicamente o documento realmente contém o símbolo, e a referência da entidade - o último é apenas uma questão de codificação. (Estou pensando em voz alta aqui - por favor, não tome isso como informações autorizadas.)

O que você está fazendo com o documento depois de carregá -lo?

Eu acredito se você colocar o conteúdo da entidade na seção CDATA, ele deve deixar tudo sozinho, por exemplo,

<root>
<testnode>
<![CDATA[some text &#8482;]]>
</testnode>
</root>

As referências de entidade não estão codificando específicas. De acordo com Recomendação W3C XML 1.0:

Se a referência do personagem começar com "&#x", os dígitos e as letras até o término; Forneça uma representação hexadecimal do ponto de código do personagem na ISO/IEC 10646.

O &#xxxx; As entidades são consideradas o caráter que representam. Todo o XML é convertido em unicode na leitura e essas entidades são removidas em favor do caráter unicode que eles representam. Isso inclui qualquer ocorrência para eles na fonte Unicode, como a string passada para o loadxml.

Da mesma forma, escrever qualquer personagem que não possa ser representado pelo fluxo que está sendo escrito é convertido em um &#xxxx; entidade. Há pouco sentido tentando preservá -los.

Um erro comum é esperar obter uma string de um DOM por alguns meios que use uma codificação que não seja unicode. Isso simplesmente não acontece independentemente do que o

Obrigado por toda a ajuda.

Eu corrigi meu problema escrevendo uma função HTMLENCODE que realmente substitui todos os personagens antes que eles os cuspiram na página da web (em vez de confiar no htmlencode um tanto quebrado () .NET Função que parece apenas codificar um pequeno subconjunto do personagens necessários)

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