it-swarm-eu.dev

So prüfen Sie, ob in der Zeichenfolgeeingabe eine gültige XML-Datei vorhanden ist, bevor Sie .LoadXml () aufrufen

Am liebsten würde ich dies tun, ohne eine Ausnahme in LoadXml() abzufangen und diese Ergebnisse als Teil meiner Logik zu verwenden. Irgendwelche Ideen für eine Lösung, bei der die XML-Datei nicht manuell analysiert wird? Ich denke, VB hat einen Rückgabewert von false für diese Funktion, anstatt eine XmlException auszulösen. Xml-Eingabe wird vom Benutzer bereitgestellt. Vielen Dank!

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

Fangen Sie einfach die Ausnahme. Der geringe Aufwand für das Abfangen einer Ausnahme sinkt im Vergleich zum Parsen der XML-Datei.

Wenn Sie die Funktion (aus stilistischen Gründen, nicht aus Gründen der Leistung) möchten, implementieren Sie sie selbst:

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

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

10
Sunny Milenov

Ich konnte XmlValidatingReader & ValidationEventHandler nicht zum Funktionieren bringen. Die XmlException wird weiterhin für falsch geformte XML-Dateien ausgelöst. Ich überprüfte dies, indem ich die Methoden mit Reflektor betrachtete.

Ich muss in der Tat Hunderte von kurzen XHTML-Fragmenten 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 funktionierte auch nicht.

Hat jemand Erfolg mit einem Regex?

6
Dan

Wenn Ihnen das Abfangen zu viel ist, sollten Sie das XML vorher mithilfe eines XML-Schemas validieren, um sicherzustellen, dass das XML in Ordnung ist. Dies ist jedoch wahrscheinlich schlimmer als das Abfangen.

3

Wie bereits gesagt, möchte ich lieber die Ausnahme abfangen, aber mit XmlParserContext könnten Sie versuchen, "manuell" zu analysieren und jede Anomalie abzufangen. Wenn Sie jedoch nicht 100 xml-Fragmente pro Sekunde analysieren, warum dann nicht die Ausnahme abfangen?

1