標題所說的功能要求很簡單,卻能涵蓋九成以上的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升版來解決弱點了。