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

Chr*_*nce 39 .net c# xml exception-handling

我更喜欢这样做而不会捕获异常,LoadXml()并将此结果用作逻辑的一部分.对于不涉及手动解析xml的解决方案的任何想法?我认为VB对此函数的返回值为false,而不是抛出XmlException.Xml输入由用户提供.非常感谢!

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

Ras*_*ber 61

抓住例外.与解析XML相比,捕获异常淹没的开销很小.

如果你想要这个功能(出于风格原因,而不是性能),请自己实现:

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

  • 验证XML预解析的成本基本上是对XML的完整传递,跟踪状态并检查所有文本的有效性.我不敢相信它比偶尔的XmlException便宜. (6认同)
  • 你做过测量来证明这一点吗?另外,请记住,如果实际抛出异常,try-catch只会强加其(相对较小的)性能损失. (4认同)
  • XML来自哪里?如果您期望大多数时间都使用有效的XML,则不值得在每次调用时验证开销.只需处理异常并继续. (3认同)
  • 这种情况发生在非常高负载环境中的页面加载上,异常的开销很小,但足够重要,需要避免. (2认同)

Sun*_*nov 10

如果您提供自己的ValidationEventHandler,则使用XmlValidatingReader将阻止异常.


Dan*_*Dan 6

我无法使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;
}
Run Code Online (Sandbox Code Playgroud)

XmlParserContext也不起作用.

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

  • >任何人都成功使用regx?让我想起一句名言:"有些人在遇到问题时会想"我知道,我会使用正则表达式."现在他们有两个问题." (7认同)