如何在调用.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也不起作用。
有人用正则表达式成功吗?