Testen, ob etwas in C # analysierbar ist oder nicht. [duplizieren]

8

Kennt jemand eine schnelle Möglichkeit zu überprüfen, ob eine Zeichenfolge in C # als XML analysierbar ist? Vorzugsweise etwas schnelles, wenig Ressourcen, das einen Booleschen Wert zurückgibt, ob es analysiert wird oder nicht.

Ich arbeite an einer Datenbank-App, die sich mit Fehlern befasst, die manchmal als XML gespeichert werden und manchmal nicht. Daher möchte ich die Zeichenfolge, die ich aus der Datenbank (die in einer DataTable enthalten ist), sehr schnell testen ... und nicht auf try / catch {} -Anweisungen oder andere Kludges zurückgreifen müssen ... es sei denn Das sind die einzigen Möglichkeiten, dies zu erreichen.

    
user978122 09.09.2013, 18:28
quelle

5 Antworten

9

Es hört sich so an, als ob Sie manchmal XML zurückbekommen und manchmal erhalten Sie "einfachen" (Nicht-XML) Text zurück.

Wenn das der Fall ist, können Sie einfach überprüfen, ob der Text mit < beginnt:

%Vor%

Da "normale" Nachrichten wahrscheinlich nicht mit < beginnen, kann dies sinnvoll sein. Das einzige, was Sie entscheiden müssen, ist, was Sie im Randfall tun müssen, wenn Sie Nicht-XML-Text haben, der mit einem < beginnt?

Wenn ich es wäre, würde ich versuchen, es zu parsen und die Ausnahme zu fangen:

%Vor%

Auf diese Weise haben Sie den Overhead einer ausgelösten Ausnahme nur, wenn Sie eine Nachricht haben, die mit < beginnt, aber kein gültiges XML ist.

    
D Stanley 09.09.2013, 18:46
quelle
5

Sie könnten versuchen, die Zeichenfolge in ein XDocument zu analysieren. Wenn es nicht analysiert wird, wissen Sie, dass es nicht gültig ist.

%Vor%

Und wenn Sie nicht möchten, dass das hässliche try / catch sichtbar wird, können Sie es in eine Erweiterungsmethode für die String-Klasse ...

werfen %Vor%

Dann sieht Ihr Code einfach wie if (mystring.IsValidXml()) {

aus     
John Kraft 09.09.2013 18:35
quelle
4

Der einzige Weg, wie Sie wirklich herausfinden können, ob etwas tatsächlich analysiert wird, ist ... es zu versuchen und zu parsen.

Ein XMl-Dokument sollte (aber möglicherweise nicht) eine XML-Deklaration am Anfang der Datei haben, die der BOM (falls vorhanden) folgt. Es sollte ungefähr so ​​aussehen:

%Vor%

Obwohl das Kodierungsattribut, glaube ich, optional ist (standardmäßig UTF-8. Es könnte auch ein standalone Attribut haben, dessen Wert yes oder no ist. Wenn das vorhanden ist, ist das ein ziemlich guter Indikator dass das Dokument angenommen ist, um gültiges XML zu sein.

Riffing on @ GaryWalker ausgezeichnete Antwort , so etwas ist etwa so gut wie es geht, denke ich (obwohl die Einstellungen müssen möglicherweise etwas optimiert werden, vielleicht ein benutzerdefinierter No-Op-Resolver. Nur zum Spaß habe ich eine zufällige XML-Datei mit 300 MB erstellt, die XMark xmlgen ( Ссылка ) verwendet: Sie wird mit dem folgenden Code validiert 1,7-1,8 Sekunden abgelaufene Zeit auf meinem Desktop-Rechner.

%Vor%     
Nicholas Carey 16.09.2013 23:11
quelle
1

Die beste Antwort, die ich zum Testen von wohlgeformtem XML, das ich kenne, ist, scheint Was ist der schnellste Weg, um programmatisch die Wohlgeformtheit von XML-Dateien in C # zu überprüfen? formedness-of-xml-file "Es umfasst die Verwendung eines XMLReaders, um dies effizient zu tun.

    
Gary Walker 09.09.2013 18:44
quelle
0

Es gibt nicht viele Möglichkeiten zu bestimmen, ob XML gültig ist. Ich mache grundsätzlich zwei Schritte.

Überprüfen Sie, ob es mit dem erforderlichen XML-Tag (so ähnlich) beginnt

%Vor%

dann stellen Sie sicher, dass es gleiche < und > (etwas wie)

gibt %Vor%

Abgesehen von der grundlegenden Überprüfung wird es etwas, was ein Prozess, der tatsächlich mit XML vertraut ist, tun sollte (NICHT regex), um zu garantieren, dass er analysiert.

    
Erik Philips 09.09.2013 18:40
quelle

Tags und Links