標題所說的功能要求很簡單,卻能涵蓋九成以上的XML電文的要求。
先講故事:隨著資安意識抬頭,當初好用的Java XML解析套件一直被掃出弱點,在舊系統修改疲於奔命解弱點,升jar版本。到接了一個Spring Boot新系統開發,我在開發手冊明訂如下:
上述XML不能有重複Tag是指不能套疊或多筆相同tag,如下:
<a>
<a>b</a>
</a>
<list>
<a>b</a>
<a>c</a>
</list>
而事實上電文設計者也不愛把事情變複雜,也不會設計出上述的schema,甚至套嵌到第四層很少見了。所以用Regex取得XML的Tag值的公用程式,可以取代九成XML解析套件的功能。Sample如下:
// 取得標籤值,若空標籤回空字串,無標籤則回Null
private String getTagValue(String xml, String tag) {
Pattern pattern = Pattern.compile("<" + tag + ">(.+?)</" + tag + ">");
Matcher mat = pattern.matcher(xml);
if (mat.find()) {
return mat.group(1);
} else {
Pattern pattern1 = Pattern.compile("<" + tag + " ?/>");
mat = pattern1.matcher(xml);
if (mat.find()) {
return "";
}
}
return null;
}
// 取得標籤值,若空標籤或無標籤預設回"0"
private String getTagNumber(String xml, String tag) {
Pattern pattern = Pattern.compile("<" + tag + ">(.+?)</" + tag + ">");
Matcher mat = pattern.matcher(xml);
if (mat.find()) {
return mat.group(1);
} else {
Pattern pattern1 = Pattern.compile("<" + tag + " ?/>");
mat = pattern1.matcher(xml);
if (mat.find()) {
return "0";
}
}
return "0";
}
上面兩支method,一個當字串取值,一個當作數字取值。而數值取值部份遇到查無此Tag也是回"0",不像字串是回null,至於型態轉換是呼叫者自己要處理的。
結論:至少該Spring Boot上線前經過第三方套件弱掃DependencyCheck掃瞄過後,完全不用再尋找什麼dom4j、jdom2升版來解決弱點了。