我必须维护承包商的代码。它有这个“有趣”的片段:
String webServicesValue =
webResponse.substring(webResponse.indexOf("<" + fieldName + ">") +
fieldName.length() + 2,
webResponse.indexOf("</" + fieldName + ">"));
我花了几分钟才明白他想要做什么。
它似乎是一个WTF代码,但我的同事建议,“如果没有破坏,请不要修复它。”我想知道这段代码是否会失败。到目前为止似乎工作正常,我真的不能想到一个测试用例会失败。
谢谢,
答案 0 :(得分:8)
是。如果“&lt; fieldname&gt;”将抛出异常在回复中没有出现。具体来说,它会尝试调用webResponse.substring(fieldName.length()+ 1,-1);
“&LT;字段名/&gt;” 中会导致类似的问题,元素上的任何属性都会出现。
如果您收到“&lt; fieldname&gt; ...&lt; fieldname&gt; ...&lt; / fieldName&gt; ...&lt; / fieldName&gt;”,您将得到错误的答案。
编辑:根据后续讨论,我会说应该重写此代码以使用正确的XML解析器...除非您/您的团队能够保证代码永远不会必须处理有问题的XML。 XML只允许通过临时字符串操作处理太多有效(和无效)变体。答案 1 :(得分:6)
如果您收到 <fieldname/>
会怎样?
答案 2 :(得分:2)
不是手动解析XML,而是使用真正的XML解析器。有各种角落的情况很难用普通的字符串操作覆盖。使用真正的解析器也会更具可读性。最好将XML数据视为二进制数据,尤其是在考虑所有可能的字符编码时。
答案 3 :(得分:2)
除了Igor Brejc和Stephen C的上述回答之外,还有CDATA:
<fieldname><![CDATA[ I am not really </fieldname> ]]></fieldname>
甚至
<othertag>
<![CDATA[ I am not really <fieldname> and there is no closing tag ]]>
</othertag>
答案 4 :(得分:1)
我建议在那种情况下重写它。如果不容易理解,那么测试就更难了。
答案 5 :(得分:1)