2008-09-17 2 views
36

Ich würde viel lieber tun, ohne eine Ausnahme in LoadXml() zu fangen und diese Ergebnisse als Teil meiner Logik verwenden. Irgendwelche Ideen für eine Lösung, die nicht manuell das XML selbst analysieren? Ich denke VB hat einen Rückgabewert von false für diese Funktion, anstatt eine XmlException zu werfen. Xml-Eingabe wird vom Benutzer bereitgestellt. Vielen Dank!Wie nach gültigem XML in String-Eingabe vor dem Aufruf .LoadXml() zu überprüfen

if (!loaded) 
{ 
    this.m_xTableStructure = new XmlDocument(); 
    try 
    { 
      this.m_xTableStructure.LoadXml(input); 
      loaded = true; 
    } 
    catch 
    { 
      loaded = false; 
    } 
} 

Antwort

55

Nur die Ausnahme fangen. Der kleine Overhead, der beim Auslösen einer Exception auftritt, wird im Vergleich zum Parsen der XML-Datei erstickt.

Wenn Sie die Funktion (aus stilistischen Gründen, nicht für die Leistung) wollen, implementieren Sie es selbst:

public class MyXmlDocument: XmlDocument 
{ 
    bool TryParseXml(string xml){ 
    try{ 
     ParseXml(xml); 
     return true; 
    }catch(XmlException e){ 
     return false; 
    } 
} 
+2

Dies geschieht beim Laden der Seite in einer Umgebung mit sehr hoher Last, der Overhead von der Ausnahme ist klein, aber signifikant genug, dass es vermieden werden muss. –

+4

Haben Sie die Messungen gemacht, um dies zu beweisen? Denken Sie auch daran, dass der try-catch nur dann eine (relativ kleine) Leistungseinbuße auferlegt, wenn die Ausnahme tatsächlich ausgelöst wird. –

+3

Woher kommt das XML? Wenn Sie die meiste Zeit mit gültigem XML rechnen, lohnt es sich nicht, bei jedem Aufruf zu überprüfen. Behandeln Sie die Ausnahme und gehen Sie weiter. –

10

Die Verwendung eines XmlValidatingReader verhindert die Ausnahmen, wenn Sie Ihren eigenen ValidationEventHandler angeben.

1

wie schon gesagt worden ist, würde ich eher die Ausnahme abfangen, aber XmlParserContext verwenden, könnten Sie versuchen, parsen "manuell" und fangen jede Anomalie ab; Wenn Sie jedoch nicht 100 XML-Fragmente pro Sekunde analysieren, können Sie die Ausnahme nicht abfangen.

3

Wenn das Fangen zu viel für Sie ist, dann sollten Sie das XML vorher validieren, indem Sie ein XML-Schema verwenden, um sicherzustellen, dass das XML in Ordnung ist. Aber das wird wahrscheinlich schlimmer sein als das Fangen.

6

Ich konnte XmlValidatingReader & ValidationEventHandler nicht funktionieren. Die XmlException wird immer noch für falsch formatierte XML-Dateien ausgegeben. Ich habe dies überprüft, indem ich die Methoden mit Reflektor betrachtet habe.

Ich muss in der Tat 100s kurze XHTML-Fragmente pro Sekunde validieren.

public static bool IsValidXhtml(this string text) 
{ 
    bool errored = false; 
    var reader = new XmlValidatingReader(text, XmlNodeType.Element, new XmlParserContext(null, new XmlNamespaceManager(new NameTable()), null, XmlSpace.None)); 
    reader.ValidationEventHandler += ((sender, e) => { errored = e.Severity == System.Xml.Schema.XmlSeverityType.Error; }); 

    while (reader.Read()) { ; } 
    reader.Close(); 
    return !errored; 
} 

XmlParserContext hat auch nicht funktioniert.

Wer gelingt mit einem Regex?

+6

> Wer gelingt mit einem Regx? Erinnert mich an ein berühmtes Zitat: "Manche Leute, wenn sie mit einem Problem konfrontiert sind, denken" Ich weiß, ich werde reguläre Ausdrücke verwenden. "Jetzt haben sie zwei Probleme." –

+0

Sie machen Witze über die Regex, richtig? Falsches Werkzeug für den Job vollständig. Es ist im Grunde das gleiche Problem wie folgt: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – Anthony

+0

dieser ungültige Text gilt als gültig: sdf >>>> Amit

Verwandte Themen