Pergunta

Eu estou gerando alguns documentos XML e quando ele vem para a parte do endereço que eu tenho de fragmentos que se parecem com isto:

<Address>15 Sample St
Example Bay
Some Country</Address>

O XSLT que eu tenho para a conversão para o XHTML tem um pouco de funk recursiva modelo para converter os caracteres de nova linha dentro de cadeias de caracteres para <br /> as tags.

Isso é tudo funcionando bem;mas é considerada "má prática" confiar em quebras de linha dentro de documentos XML?Se assim for, é recomendado que eu faço isso de vez?

<Address><Line>15 Sample St</Line>
<Line>Example Bay</Line>
<Line>Some Country</Line></Address>

Parece que seria realmente estranho envolva cada lugar, onde o meu texto pode ser de várias linhas com marcas como aquele..

Foi útil?

Solução

É geralmente considerado uma má prática dependem de quebras de linha, já que ele é frágil para diferenciar de dados.Enquanto a maioria dos processadores de XML irá preservar qualquer espaço em branco que você colocou no seu XML, não é garantido.

O problema real é que a maioria das aplicações que a saída XML em um formato legível considerar todos os espaços em branco em um XML intercambiáveis, e pode entrar em colapso a essas quebras de linha em um único espaço.Por isso, sua XSLT tem que saltar através de aros para processar os dados corretamente.Usando um "br" tag seria simplificam consideravelmente a transformação.

Outro problema potencial é que se você abrir seu documento XML em um editor de XML e muito, imprimi-lo, é provável que você a perder aqueles quebras de linha.

Se você continuar usando quebras de linha, certifique-se de adicionar um xml:space="preserve" atributo "endereço". (Você pode fazer isso em seu DTD, se você estiver usando um.)

Algumas sugestões de leitura

Aplicações de XML, muitas vezes, parecem assumir um atitude cavalheiresca em relação aos espaços em branco porque as regras sobre os lugares em um documento XML onde o espaço em branco não importa, às vezes, dar a essas aplicações à rédea solta para adicionar ou remover espaços em branco em determinados lugares.

Outras dicas

Algumas pessoas já disseram que CDATA blocos irá permitir que você mantenha as quebras de linha.Isso é errado.Seções CDATA só vai fazer marcação de ser processado como dados de caracteres, eles serão não alteração de quebra de linha de processamento.

<Address>15 Sample St
Example Bay
Some Country</Address>

é exatamente o mesmo como

<Address><![CDATA[15 Sample St
Example Bay
Some Country]]></Address>

A única diferença é a forma como diferentes APIs este relatório.

Eu acho que o único problema real é que torna o XML mais difícil de ler.exemplo:

<Something>
    <Contains>
        <An>
            <Address>15 Sample St
Example Bay
Some Country</Address>
        </An>
    </Contains>
</Something>

Se bonita XML não é uma preocupação, eu provavelmente não se preocupar com isso, enquanto ele está trabalhando.Se bonita XML é uma preocupação, eu tinha de converter o explícito quebras de linha em <br /> tags ou \n antes de integrá-los em XML.

Que tal usar atributos para armazenar os dados, em vez de nós de texto:

<Address Street="15 Sample St" City="Example Bay" State="" Country="Some Country"/>

Eu sei que o uso de atributos vs.nós de texto é um assunto muito debatido, mas eu estou preso com atributos de 95% do tempo, e não tive problemas por causa disso.

Depende de como você está lendo e a escrever o XML.

Se o XML é gerado automaticamente - se quebras de linha ou explícita bandeiras estão a ser analisado em
- então não há nada para se preocupar.Sua entrada provável que não tem qualquer outro XML na forma apenas de limpeza para não mexer com XML em tudo.

Se as tags estão sendo trabalhadas manualmente, é ainda mais limpo apenas ter uma quebra de linha, se você me perguntar.

A exceção é se você estiver usando o DOM para obter alguma estrutura do XML.Nesse caso, as quebras de linha são, obviamente, o mal porque não representam a hierarquia corretamente.Parece que a hierarquia é irrelevante para a sua aplicação, apesar de, para quebras de linha de som suficiente.

Se o XML apenas parece ruim (especialmente quando gerado automaticamente), Arrumado pode ajudar, embora ele funciona melhor com o HTML do que com o XML.

Este é, provavelmente, um pouco enganoso exemplo, uma vez que o endereço é uma bits não normalizados neste caso.É razoável trade-off, no entanto, desde campos de endereço de são difíceis de se normalizar.Se você faz a linha de quebra levar informações importantes, você está onu-normalizar e fazer o post office interpretar o sentido da quebra de linha.

Eu diria que, normalmente, isso não é um grande problema, mas neste caso eu acho que a Linha de tag é a mais correta, uma vez que explicitamente mostra que você realmente não interpretar o que as linhas podem significar em diferentes culturas.(Lembre-se que a maioria dos formulários para inserir um endereço código postal, etc., e a linha de endereço 1 e 2.)

O constrangimento de ter a linha de tag vem com normal XML, e tem sido muito debatido na codificação de horror. http://www.codinghorror.com/blog/archives/001139.html

A especificação XML tem algo a dizer sobre espaço em branco e alimentações de linha e retorno de carro, em particular,.Então, se você se limitar a verdadeira alimentação de linha (x0A) você deve estar Ok.No entanto, muitas ferramentas de edição irá reformatar XML para "melhor apresentação" e, possivelmente, de se livrar da sintaxe especial.Um mais robusto e mais limpo do que o "< linha>< / linha>" idéia seria a de simplesmente utilizar espaços de nomes e incorporar conteúdo XHTML, por exemplo:

<Address xmlns="http://www.w3.org/1999/xhtml">15 Sample St<br />Example Bay<br />Some Country</Address>

Não é necessário reinventar a roda quando se trata de norma de vocabulários.

Eu não vejo o que há de errado com <Line> as tags.
Aparentemente, a visualização dos dados é importante para você, importante o suficiente para mantê-lo em seus dados (através de quebras de linha no seu primeiro exemplo).Bem.Então realmente mantê-lo, não dependem de "mágica" para mantê-lo para você.Manter todos os bits de dados, você precisará mais tarde e não pode deduzir perfeitamente salvos parte dos dados, mantê-lo mesmo se ele visualização de dados (quebras de linha e outros recursos de formatação).Seu usuário (usuário final de outro desenvolvedor) aproveitou o momento para o formato que os dados a seu gosto - ou dizer-lhe (API doc / text perto da entrada) que não tem a intenção de mantê-lo, ou apenas mantê-lo.

Sim, eu acho que usando um CDATA bloco seria proteger o espaço em branco.Apesar de alguns analisador de APIs permitem que você para preservar o espaço em branco.

O que você realmente deve fazer é converter o XML para um formato que preserva espaço em branco.

Assim, em vez de procurar substituir com <br /> você deve quebrar o bloco inteiro em uma <pre>

Dessa forma, seu endereço é funcionalmente preservada (se você incluir quebras de linha ou não) e o XSTL pode escolher se deseja preservar espaço em branco no resultado.

Eu recomendo que você deve adicionar o <br/> quebras de linha ou, talvez, usar quebra de linha entidade - &#x000D;

Se você precisa de quebras de linha preservada, use um bloco CDATA, como tweakt disse:

Caso contrário, tome cuidado.A maior parte do tempo, as quebras de linha serão preservados pelo software de XML, mas às vezes não, e você realmente não quer depender de coisas que só funcionam por coincidência

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