2009-07-31 134 views
2

我不得不從承包商維護的代碼。它有這個「有趣」的片段:測試用例失敗此代碼?

String webServicesValue = 
    webResponse.substring(webResponse.indexOf("<" + fieldName + ">") + 
         fieldName.length() + 2, 
         webResponse.indexOf("</" + fieldName + ">")); 

我花了幾分鐘的時間才明白他想要做什麼。

這似乎是一個跆拳道的代碼,但我的同事建議,「如果不破,不解決它。」我想知道這段代碼是否會失敗。它似乎工作到目前爲止,我真的不能想到測試用例會導致失敗。

感謝,

+0

我想這應該是你做加法 – 2009-07-31 06:55:00

+0

「失敗fieldName.length() 「as in」引發異常? – 2009-07-31 06:55:31

+0

你說得對,它是fieldName.length()。 – gineer 2009-07-31 08:15:10

回答

8

是。如果「<字段名>」是不存在的響應會拋出異常。具體來說,它會嘗試調用webResponse.substring(fieldName.length()+ 1,-1);

「< fieldname/>」將會導致類似的問題,因爲元素上的任何屬性。

,如果你得到 「<字段名> ... <字段名> ... < /字段名> ... < /字段名>」,你會得到錯誤的答案。

編輯:在後續討論的情況,我會說,這個代碼應該被重寫的使用恰當的XML解析器......除非你/你的團隊可以保證代碼將永遠必須處理有問題的XML。 XML只允許通過特定字符串操作來處理太多有效(和無效)變體。

1

我建議在這種情況下,重新寫它。如果不容易理解,那麼測試就更加困難。

+0

+1同意。任何需要幾分鐘才能理解的單行代碼都是維護問題,因此應該重寫。 (在這種情況下,代碼顯然是「壞了」!) – 2009-07-31 07:33:53

+0

我應該如何重寫它?我正在考慮使用合適的XML解析器來代替這個黑客工作,但是,正如我所提到的,我的同事(擁有更多的經驗和資歷)告訴我,除非證明破壞(即需要適當的XML解析器),否則不要修復它。 – gineer 2009-07-31 08:20:04

6

如果您收到,會發生什麼<fieldname/>

1
  • 嵌套的標籤。你會在第一打開標籤開始,跳過存在的任何其他人並停止在第一關標籤,而不是匹配的結束標記。
  • 有着密切的標籤某處開放標記之前
2

(你從字符串,而不是打開的標籤年底開始搜索的關閉標記),而無需手動解析XML是更好使用真正的XML解析器。有各種各樣的角落案例難以用簡單的字符串處理來覆蓋。使用真正的解析器也會更具可讀性。最好將XML數據視爲二進制數據,特別是在考慮所有可能的字符編碼時。

2

除了上面伊戈爾Brejc和斯蒂芬·C'S反應,有CDATA:

<fieldname><![CDATA[ I am not really </fieldname> ]]></fieldname> 

甚至

<othertag> 
    <![CDATA[ I am not really <fieldname> and there is no closing tag ]]> 
</othertag>