2009-06-22 80 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);

相關問題