Question

Ok, je lis les données d'un flux en utilisant un StreamReader. Les données dans le flux n'est pas xml, il pourrait être quelque chose.

D'après les StreamReader d'entrée j'écris à un flux de sortie en utilisant un XmlTextWriter. Fondamentalement, quand tout est dit et fait, le flux de sortie contient des données à partir du flux d'entrée enveloppé dans un élément contenu dans un élément parent.

Mon problème est double. Les données est lu à partir du flux d'entrée en morceaux, et les rendements de la classe StreamReader char []. Si les données dans le flux d'entrée contient un « ]]> » il doit être divisé entre deux éléments CDATA. Tout d'abord, comment puis-je recherche « ]]> » dans un tableau de caractères? Et deuxièmement, parce que je lis en morceaux, la sous-chaîne « ]]> » pourrait être divisé entre deux morceaux, alors comment puis-je expliquer?

Je pourrais probablement convertir le char [] à une chaîne, et faire une recherche là-dessus remplacer. Cela réglerait mon premier problème. Sur chaque lecture, je pouvais également vérifier si le dernier caractère était un « ] », de sorte que sur la lecture suivante, si les deux premiers caractères sont « ]> » Je commence une nouvelle section CDATA.

Cela semble peu efficace car elle implique la conversion du tableau de caractères à une chaîne, ce qui signifie passer du temps à copier les données, et de manger jusqu'à deux fois la mémoire. Y at-il un moyen plus efficace, à la fois speedwise et de la mémoire sage?

Était-ce utile?

La solution

  

En second lieu, parce que je lis en morceaux, la sous-chaîne « ]]> » pourrait être divisé entre deux morceaux, alors comment puis-je compte pour cela?

En effet, vous devez retenir les deux derniers caractères dans une file d'attente au lieu de les recracher immédiatement. Ensuite, lorsque de nouvelles entrées arrive, l'ajouter à la file d'attente et reprendre tous, mais les deux derniers caractères, recherche et remplacement sur eux, et la sortie.

Mieux: ne vous embêtez pas avec une section CDATA du tout. Ils sont là que pour la commodité de la main-création. Si vous faites déjà de recherche et de remplacer, il n'y a aucune raison que vous ne devriez pas simplement rechercher et remplacer « < », « > » et « & » avec leurs entités prédéfinies, et comprennent ceux dans un nœud de texte normal. Étant donné que ce sont de simples remplacements d'un seul caractère, vous n'avez pas à vous soucier de mise en mémoire tampon.

Mais. Si vous utilisez un XmlTextWriter comme vous le dites, il est aussi simple que d'appeler WriteString () sur lui pour chaque morceau de texte entrant

Autres conseils

Selon Comment faire pour éviter d'être appelé un Bozo Lorsque XML La production :

  

Ne vous embêtez pas avec les sections CDATA

     

XML fournit deux façons d'échapper à   caractères de balisage significatif:   entités prédéfinies et CDATA   sections. Les sections CDATA ne sont   sucre syntaxique. Les deux alternatives   constructions syntaxiques ont pas sémantique   différence.

     

Les sections CDATA sont pratiques   sont XML et l'édition manuellement doivent   coller un gros morceau de texte   comprend les caractères de balisage significatif   (Par ex. Des exemples de code). Toutefois, lorsque   la production de XML à l'aide d'un sérialiseur, la   sérialiseur prend soin d'échapper   automatiquement et essayer de   microgestion le choix d'échapper   méthode ouvre seulement des possibilités de   bugs.
  ...
  Seulement <,>, & et (dans les valeurs d'attributs) "besoin échapper.

Tant que le petit ensemble de caractères spéciaux sont codés / échappaient devrait fonctionner.

Que vous ayez à gérer vous-même qui s'échappe est une autre affaire, mais certainement un problème beaucoup plus simple à résoudre.

Alors ajoutez juste le tout comme un nœud de texte enfant à l'élément XML correspondant.

Je connais exactement deux des cas d'utilisation pour CDATA:

L'un est dans un document XHTML contenant le script:

<script type="text/javascript">
<![CDATA[
   function foo()
   {
      alert("You don't want <this> text escaped.");
   }
]]>
</script>

L'autre est dans les documents XML écrit à la main où le texte contient des balises, par exemple noyé:.

<p>
   A typical XML element looks like this:
</p>
<p>
   <pre>
   <![CDATA[
      <sample>
         <text>
            I'm using CDATA here so that I don't have to manually escape
            all of the special characters in this example.
         </text>
      </sample>
   ]]>
   </pre>
</p>

Dans tous les autres cas, tout en laissant le DOM (ou XmlWriter, ou quel que soit l'outil que vous utilisez pour créer le XML) échapper aux nœuds de texte fonctionne très bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top