2009-06-22 76 views
24

有没有人知道我可以检查一个字符串是否包含格式良好的XML,而不是在try/catch块中使用类似XmlDocument.LoadXml()的东西?我已经得到了可能或可能不是XML的输入,并且我希望代码承认在不依赖try/catch的情况下输入可能不是XML,无论是速度还是非常规环境都不应该提高的一般原则例外。我目前有这样的代码;检查没有try/catch的格式良好的XML?

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。在调试过程中,例外情况会导致快乐,因为每次检查一个字符串时,调试器都会在这里中断,'帮助'解决我的麻烦问题。

+0

如果调试器是你的问题你可以关掉XmlExceptions的用户操作。使用VS中的快捷键:Ctrl + Alt + E,找到System.Xml.XmlException并将其关闭。 – nashwan 2013-01-31 15:40:24

回答

21

我不知道一种没有例外的验证方式,但是如果它未被处理,您可以将调试器设置更改为只破坏XmlException - 即使代码仍然不雅,应该解决您的直接问题。

为此,请转到Debug/Exceptions .../Common Language Runtime Exceptions并找到System.Xml.XmlException,然后确保只勾选了“用户未处理”(未投掷)。

+0

+1这个拯救生命的解决方案。如果我必须调试失败的代码,我只能启用处理的异常。 – OregonGhost 2009-06-22 09:28:49

5

这是一个合理的方式来做到这一点,除了IsNullOrEmpty是多余的(LoadXml可以算出来)。如果保持IsNullOrEmpty,则执行if(!string.IsNullOrEmpty(value))。

虽然基本上,你的调试器是问题,而不是代码。

+0

我已经同意了。我用一个调试器属性[DebuggerStepThrough]标记了该方法,该属性停止调试器停止异常。 – 2010-09-22 09:47:31

+0

IsNullOrEmpty只是一种优化措施,用于在您调用IsValidXml(“”)时避免异常的开销 - 这在我的程序中发生了很大的变化。 – 2010-09-22 09:48:34

3

[System.Diagnostics.DebuggerStepThrough]属性添加到IsValidXml方法。这将抑制XmlException被调试器捕获,这意味着您可以打开捕获first-change异常,并且不会调试此特定方法。

1

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

另一个MSDN文章的例子中,我添加了代码来读取 XML流的全部内容。

string str = "<ROOT>AQID</ROOT>"; 
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

0

我不同意,这个问题是调试器。一般而言,对于非例外情况,应避免例外情况。这意味着如果有人正在寻找一种像IsWellFormed()这样的方法,该方法根据输入是否为格式正确的XML返回true/false,则不管是否捕获并处理异常,都不应在此实现中抛出异常。

异常很贵,在正常成功执行过程中不应遇到异常。一个例子是编写一个方法来检查文件的存在,并使用File.Open并在文件不存在的情况下捕获异常。这将是一个糟糕的实施。应该使用File.Exists()(并且希望这个实现不会简单地把一个try/catch放在某个抛出异常的方法中,如果该文件不存在,我相信它不会)。

+0

我不确定这个答案是否有用。你还没有提供另一种方法来检查没有抛出异常的良构。这似乎是关于您对抛出异常的方法的看法的陈述。 – 2012-10-23 17:54:18

5

史蒂夫,

我们有一个第三方的不小心,有时给我们送来JSON,而不是XML。下面是我实现的:

public static bool IsValidXml(string xmlString) 
{ 
    Regex tagsWithData = new Regex("<\\w+>[^<]+</\\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 = "<result>true</result>"; 
    Assert.IsTrue(Utility.IsValidXml(xml)); 
} 

[TestMethod()] 
public void TestIsNotValidXml() 
{ 
    string json = "{ \"result\": \"true\" }"; 
    Assert.IsFalse(Utility.IsValidXml(json)); 
} 
0

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

-1

我的两分钱。这是非常简单的,并遵循一些共同的约定,因为它是关于解析...使用XmlDocument

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

注意它可以在不加载使用 XmlDocument doc = (XmlDocument)JsonConvert.DeserializeXmlNode(object)沿<0>some text</0>线的元素抛出异常。

数字元素名称是无效的xml,在我的情况下,直到我尝试将xmlDoc.innerText写入到xml的Sql服务器数据类型时才出现错误。

这个我现在该怎么验证和异常得到投掷
XmlDocument tempDoc = XmlDocument)JsonConvert.DeserializeXmlNode(formData.ToString(), "data"); doc.LoadXml(tempDoc.InnerXml);

相关问题