iT邦幫忙

2024 iThome 鐵人賽

DAY 3
0
佛心分享-我的私藏工具箱

正則!好好表達系列 第 3

用Regex取得XML的標籤值

  • 分享至 

  • xImage
  •  

標題所說的功能要求很簡單,卻能涵蓋九成以上的XML電文的要求。
先講故事:隨著資安意識抬頭,當初好用的Java XML解析套件一直被掃出弱點,在舊系統修改疲於奔命解弱點,升jar版本。到接了一個Spring Boot新系統開發,我在開發手冊明訂如下:

  • XML與JSON套件:
    • 高資產微服務原本有沿用業管的ESBUtil模組,但該模使用了JDOM2、Dom4J、Jaxen、Xercer這幾個屢被掃出弱點的Jar而棄用,改用Regex解析XML
      • Regex解析XML的前提是,同一份電文不會有重複Tag
    • com.faster.jackson套件仍需保留,它同時支援XML與JSON,主要它被Spring Boot及Maven重度使用,且幾乎是標準的JSON與POJO互轉工具
      • 保持用同一份JSON工具,如Gson、JSON-Lib就不要引進,全用jackson。
  • Java標準套件能取代Apache Commons套件者,就儘量不用Commons套件
    • java.nio套件有相當程度取代commons-io、commons-compress套件。

上述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升版來解決弱點了。


上一篇
SSH Terrapin Prefix Truncation Weakness (CVE-2023-48795) 弱點修正
下一篇
Java在漢字、全形字的偵測
系列文
正則!好好表達30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言