在没有try / catch的情况下检查格式良好的XML?

有没有人知道如何检查字符串是否包含格式良好的XML而不使用try / catch块中的XmlDocument.LoadXml() ? 我有输入可能是也可能不是XML,我希望代码能够识别输入可能不是XML而不依赖于try / catch,速度和非特殊情况不应该提高的一般原则例外。 我目前有代码执行此操作;

 private bool IsValidXML(string value) { try { // Check we actually have a value if (string.IsNullOrEmpty(value) == false) { // Try to load the value into a document XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(value); // If we managed with no exception then this is valid XML! return true; } else { // A blank value is not valid xml return false; } } catch (System.Xml.XmlException) { return false; } } 

但它似乎不应该需要try / catch。 exception是在调试期间导致快乐的地狱,因为每次我检查字符串时调试器都会在这里中断,“帮助”我解决我的麻烦问题。

我不知道如何在没有exception的情况下进行validation,但是你可以将调试器设置更改为仅在XmlException中断(如果它未处理) – 这应该可以解决您的直接问题,即使代码仍然不优雅。

为此,请转到Debug / Exceptions … / Common Language Runtime Exceptions并找到System.Xml.XmlException,然后确保仅选中“User-unhandled”(不是Thrown)。

史蒂夫,

我们有一个第三方偶然发送了JSON而不是XML。 这是我实施的:

 public static bool IsValidXml(string xmlString) { Regex tagsWithData = new Regex("<\\w+>[^<]+"); //Light checking if (string.IsNullOrEmpty(xmlString) || tagsWithData.IsMatch(xmlString) == false) { return false; } try { XmlDocument xmlDocument = new XmlDocument(); xmlDocument.LoadXml(xmlString); return true; } catch (Exception e1) { return false; } } [TestMethod()] public void TestValidXml() { string xml = "true"; Assert.IsTrue(Utility.IsValidXml(xml)); } [TestMethod()] public void TestIsNotValidXml() { string json = "{ \"result\": \"true\" }"; Assert.IsFalse(Utility.IsValidXml(json)); } 

这是一种合理的方法,除了IsNullOrEmpty是冗余的(LoadXml可以很好地解决这个问题)。 如果你确实保留了IsNullOrEmpty,请执行if(!string.IsNullOrEmpty(value))。

但基本上,您的调试器是问题,而不是代码。

[System.Diagnostics.DebuggerStepThrough]属性添加到IsValidXml方法。 这样可以防止调试器捕获XmlException,这意味着您可以启用捕获首次更改的exception,并且不会调试此特定方法。

使用XmlDocument可以使用XmlDocument doc = (XmlDocument)JsonConvert.DeserializeXmlNode(object)<0>some text的行中加载元素, 不会抛出exception。

数字元素名称不是有效的xml,在我的情况下,在我尝试将xmlDoc.innerText写入xml的Sql server数据类型之前,没有发生错误。

这是我现在validation的方式,并抛出exception
XmlDocument tempDoc = XmlDocument)JsonConvert.DeserializeXmlNode(formData.ToString(), "data"); doc.LoadXml(tempDoc.InnerXml);

XmlTextReader类是XmlReader的一个实现,它提供了一个快速,高性能的解析器。 它强制执行XML必须格式良好的规则。 它既不是validation解析器也不是非validation解析器,因为它没有DTD或架构信息。 它可以以块的forms读取文本,也可以从流中读取字符。

以及另一篇MSDN文章中的示例,我已经添加了代码来读取XML流的全部内容。

 string str = "AQID"; XmlTextReader r = new XmlTextReader(new StringReader(str)); try { while (r.Read()) { } } finally { r.Close(); } 

来源: http : //bytes.com/topic/c-sharp/answers/261090-check-wellformedness-xml

我不同意问题是调试器。 一般而言,对于非例外情况,应避免例外。 这意味着如果某人正在寻找像IsWellFormed()这样的方法,它根据输入是否是格式良好的XML返回true / false,则不应该在此实现中抛出exception,无论它们是否被捕获和处理。

例外是昂贵的,在正常成功执行期间不应该遇到它们。 一个例子是编写一个方法来检查文件的存在并使用File.Open并在文件不存在的情况下捕获exception。 这将是一个糟糕的实施。 应该使用File.Exists() (并且希望它的实现不会简单地将try / catch放在一些抛出exception的方法中,如果文件不存在,我确定它没有)。

只是我的2美分 – 关于这个有各种各样的问题,大多数人同意“垃圾进入 – 垃圾出”的事实。 我不同意这一点 – 但我个人发现了以下快速而肮脏的解决方案,特别是对于处理来自第三方的xml数据的情况,这些数据根本不能与您轻松沟通..它不会避免使用try / catch – 但它使用更精细的粒度,所以在无效的xml字符数量不那么大的情况下,它会有所帮助..我使用XmlTextReader,并为每个父元素使用其方法ReadChars(),这是命令之一没有像ReadInner / OuterXml那样进行格式良好的检查。 因此,当Read()收敛于父节点时,它是Read()和ReadChars()的组合。 当然这是有效的,因为我可以假设XML的基本结构是可以的,但某些节点的内容(值)可以包含未被&…替换的特殊字符。 等价…(我在某个地方发现了一篇关于此的文章,但目前找不到源链接)

我的两分钱。 这很简单,遵循一些常见的约定,因为它是关于解析…

 public bool TryParse(string s, ref XmlDocument result) { try { result = new XmlDocument(); result.LoadXml(s); return true; } catch (XmlException ex) { return false; } }