如何在调用.LoadXml()之前检查字符串输入中的有效xml

时间:2020-03-05 18:59:39  来源:igfitidea点击:

我更愿意在不捕获LoadXml()异常并将其结果用作逻辑一部分的情况下执行此操作。对于不涉及手动自行解析xml的解决方案有什么想法吗?我认为VB对于此函数的返回值为false,而不是抛出XmlException。 Xml输入是由用户提供的。非常感谢!

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

解决方案

回答

如果我们提供自己的ValidationEventHandler,则使用XmlValidatingReader可以防止异常。

回答

赶上例外。与解析XML相比,捕获异常所产生的少量开销被淹没了。

如果要使用该功能(出于风格原因而不是性能),请自己实现:

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

回答

就像已经说过的那样,我宁愿捕获异常,但是使用XmlParserContext,我们可以尝试"手动"解析并拦截任何异常。但是,除非我们每秒解析100个xml片段,否则为什么不捕获异常?

回答

如果捕获对我们来说太多了,那么我们可能需要使用XML Schema预先验证XML,以确保XML正常,但这可能比捕获更糟。

回答

我无法使XmlValidatingReader和ValidationEventHandler正常工作。仍然会为格式错误的xml抛出XmlException。我通过使用反射器查看方法验证了这一点。

我确实确实需要每秒验证100个短XHTML片段。

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也不起作用。

有人用正则表达式成功吗?