Kann nach erfolgreichem Marshalling nicht zurückgeräumt werden [geschlossen]

9

Ich habe eine String zusammenhängende binäre 0 innerhalb von UTF-8 ( "A\u0000B" ). JAXB marshalliert glücklich ein XML-Dokument, das ein solches Zeichen enthält, kann es jedoch nicht entpacken:

%Vor%

Die Wurzelklasse ist einfach:

%Vor%

Ausgabe-XML enthält auch binary 0 zwischen A und B (in hex: 41 00 42 ), was den folgenden Fehler während der Rückprogrammierung verursacht:

%Vor%

Interessanterweise wird mit der Raw-DOM-API ( Beispiel ) der Befehl escaped 0 : A�B erzeugt, aber der Versuch, sie zurückzulesen, ist ähnlich Error. Auch 0 (weder binär noch maskiert) ist von keinem XML-Parser oder xmllint erlaubt (siehe auch: Python + Expat: Fehler bei & amp; ; # 0; Entitäten ).

Meine Fragen:

Aber sollte XML-Stack in Java nicht reifer werden (ich benutze 1.7.0_05)? Behandle das entweder standardmäßig oder durch eine einfache Einstellung? Ich suche nach Entweichen, Ignorieren oder schnell scheitern - aber das Standardverhalten des Generierens ungültiger XML ist nicht akzeptabel. Ich glaube, dass eine solche grundlegende Funktionalität keine zusätzliche Codierung auf der Client-Seite erfordern sollte.

    
Tomasz Nurkiewicz 08.10.2012, 10:21
quelle

1 Antwort

3
  

Warum ermöglicht JAXB / DOM API das Erstellen ungültiger XML-Dokumente, die nicht zurückgelesen werden können? Sollte es beim Marshalling nicht schnell scheitern?

  1. Sie müssten die Implementierer fragen.

  2. Es ist wahrscheinlich, dass sie dachten, dass die Kosten für die Überprüfung jedes serialisierten Datenzeichens nicht gerechtfertigt wären ... besonders wenn der Parser sie dann noch einmal überprüfen würde.

  3. Nachdem Sie sich dazu entschlossen haben, den Serializer auf diese Weise zu implementieren (oder dies versehentlich getan haben), würden sie den vorhandenen Code, der davon abhängig ist, dass er serialisiert werden kann, standardmäßig deaktivieren, wenn er das Verhalten dann standardmäßig ändert XML.

  

Aber sollte XML Stack in Java nicht reifer werden (ich benutze 1.7.0_05) handle das entweder standardmäßig oder durch eine einfache Einstellung?

Nicht unbedingt ... wenn Sie den obigen Grund # 2 akzeptieren. Selbst einfache Einstellungen können sich messbar auf die Leistung auswirken.

  

Auch 0 (weder binär noch maskiert) ist von keinem XML-Parser oder xmllint erlaubt ...

Ganz zu Recht! Es ist durch die XML-Spezifikation verboten.

Ein interessanterer Test wäre jedoch, zu sehen, was passiert, wenn Sie versuchen XML mit einem ungültigen Zeichen zu generieren, indem Sie andere XML-Stacks verwenden.

  

Gibt es eine elegante und globale Lösung?

Wenn das Problem, das Sie lösen möchten, darin besteht, wie Sie \u0000 oder \u000B senden, müssen Sie eine anwendungsspezifische Kodierung auf die Zeichenfolge anwenden, bevor Sie in die Zeichenfolge einfügen DOM. Und das andere Ende muss die äquivalente Decodierung bereitstellen.

Wenn Sie versuchen, die fehlerhaften Daten zu erkennen, bevor es zu spät ist, können Sie dies mit einem Ausgabestream-Filter zwischen dem Serializer und dem endgültigen Ausgabestream tun. Aber wenn Sie die Schlechtigkeit erkennen, gibt es keine gute Möglichkeit (d. H. Transparent für den XML-Verbraucher), um es zu beheben.

    
Stephen C 08.10.2012, 10:42
quelle

Tags und Links