Frage

Ok, ich lese Daten aus einem Stream einen Stream verwenden. Die Daten in dem Stream nicht xml sind, es könnte alles sein.

Auf der Grundlage der Eingabe Stream ich an einen Ausgangsstrom Ich schreibe eine XmlTextWriter verwenden. Im Grunde genommen, wenn alles gesagt und getan ist, der Ausgangsstrom enthält Daten aus dem Eingangsstrom in einem Elemente eingewickelt in einem Mutterelement enthalten ist.

Mein Problem ist zweifach. Daten werden aus dem Eingangsstrom in Blöcken gelesen, und die Klasse Stream kehrt char []. Wenn die Daten in dem Eingangsstrom enthält ein „]]>“ muss es über zwei CDATA Elemente aufgeteilt werden. Erstens: Wie suche ich nach „]]>“ in einem char-Array? Und zweitens, weil ich in Stücken gerade lese, die „]]>“ Teilzeichen über zwei Stücke aufgeteilt werden könnten, so wie erkläre ich das?

Ich könnte wahrscheinlich die char [] in eine Zeichenfolge konvertieren, und tun es auf eine Suche ersetzen. Das wäre mein erstes Problem lösen. Auf jedem lesen konnte, ich überprüfe, um zu sehen, auch wenn das letzte Zeichen ein „]“ ist, so dass auf der nächsten Lese, wenn die ersten beiden Zeichen „]>“ Ich würde ein neuer CDATA-Abschnitt beginnen.

Das scheint kaum effizient, weil es sich um den char-Array in einen String umzuwandeln, die Ausgaben Zeit bedeutet, die Daten zu kopieren, und zweimal den Speicher auffressen. Gibt es eine effizientere Art und Weise, sowohl speedwise und Speicher weise?

War es hilfreich?

Lösung

  

zweitens, weil ich in Stücken gerade lese, die „]]>“ Teilzeichenfolge über zwei Stücke werden könnte geteilt, so wie erkläre ich das?

Tatsächlich würden Sie haben die letzten beiden Zeichen in einer Warteschlange zurück zu halten, anstatt sie zu spucken sofort aus. Dann, wenn neuer Eingang kommt, hängen Sie es an die Warteschlange und wieder alles nehmen, aber die letzten zwei Zeichen, suchen und Ersetzen über sie und ausgegeben.

Besser: gar nicht mit einem CDATA-Abschnitt stören. Sie sind nur dort für die Bequemlichkeit der Hand-Authoring. Wenn Sie bereits tun Such- und ersetzen, gibt es keinen Grund sollten Sie nicht nur suchen und Ersetzen ‚<‘, ‚>‘ und ‚&‘ mit ihren vordefinierten Entities, und diejenigen, die in einem normalen Text-Knoten umfassen. Da diese einfachen Ersatz Einzel-Zeichen sind, brauchen Sie sich nicht um Pufferung zu sorgen.

Aber:., Wenn Sie eine XmlTextWriter verwenden, wie Sie sagen, es ist so einfach wie der Aufruf von Write () auf es für jedes Stück von eingehendem Text

Andere Tipps

Nach HOWTO Vermeiden Sie einen Bozo aufgerufen werden bei der Herstellung von XML :

  

Sie nicht mit CDATA-Abschnitte stören

     

XML bietet zwei Möglichkeiten der Flucht   Markup-signifikanten Zeichen:   vordefinierten Entitäten und CDATA   Abschnitte. CDATA-Abschnitte sind nur   syntethischer Zucker. Die zwei alternativen   syntaktische Konstrukte haben keine semantische   Unterschied.

     

CDATA-Abschnitte sind praktisch, wenn Sie   bearbeiten manuell XML und müssen   einen großen Teil des Textes einfügen,   enthält Markup-signifikanten Zeichen   (Z. B. Codebeispiele). Wenn jedoch   Herstellung von XML mit einem Serializer, die   Serializer kümmert Flucht   automatisch und zu versuchen,   Mikromanagement der Wahl der Flucht   Methode öffnet nur bis Möglichkeiten   Bugs.
  ...
  Nur <,>, & und (in Attributwerten) "müssen zu entkommen.

Solange die kleine Menge von Sonderzeichen kodiert werden / entkam es sollte einfach funktionieren.

Ob Sie haben die Flucht selbst ist eine andere Sache zu handhaben, aber sicherlich ein viel einfacher zu lösen Problem.

Dann hängen Sie einfach die gesamte Partie als Kind Textknoten mit dem entsprechenden XML-Elemente.

Ich kenne genau zwei reale Anwendungsfälle für CDATA:

Eine davon ist in einem XHTML-Dokument mit Skript:

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

Die andere ist in der Hand-Autor von XML-Dokumenten, wo der Text Markup eingebettet enthält, z.

<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>

In allen anderen Fällen, nur das DOM zu lassen (oder die XmlWriter, oder was auch immer Werkzeug, das Sie verwenden den XML zu erstellen) die Flucht des Textknoten funktioniert gut.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top