44

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

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

5 回答 5

68

只需捕获异常。与解析 XML 相比,捕获异常的小额开销被淹没了。

如果您想要该功能(出于风格原因,而不是出于性能考虑),请自行实现:

public class MyXmlDocument: XmlDocument
{
  bool TryParseXml(string xml){
    try{
      ParseXml(xml);
      return true;
    }catch(XmlException e){
      return false;
    }
 }
于 2008-09-17T18:52:03.990 回答
10

如果您提供自己的 ValidationEventHandler,使用 XmlValidatingReader 将防止异常。

于 2008-09-17T18:51:03.303 回答
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;
}

XmlParserContext 也不起作用。

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

于 2009-11-12T05:41:07.100 回答
3

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

于 2008-09-17T18:56:03.933 回答
1

正如已经说过的,我宁愿捕获异常,但是使用XmlParserContext,您可以尝试“手动”解析并拦截任何异常;但是,除非您每秒解析 100 个 xml 片段,否则为什么不捕获异常呢?

于 2008-09-17T18:54:18.553 回答