首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

DOM4J 解析非標準巢狀結構 XML 實戰

     編輯:程式設計綜合問答

實際開發中常遇到結構不規範的 XML:同一層級節點結構不一致(有的只有文本,有的包含子節點)。本文以實際 XML 片段為例,講解 DOM4J 針對性解析策略。

目標 XML 結構

<?xml version='1.0' encoding='UTF-8'?>
<DBSET RESULT="1">
  <R>
    <C N="RLT_FLAG">0</C>
    <C N="TASK_TAIL">
      <DBSET RESULT="2">  <!-- 子節點:嵌套 DBSET -->
        <R>
          <C N="TASK_NO">131103507930</C>
          ...
        </R>
      </DBSET>
    </C>
  </R>
</DBSET>

解析難點

<C> 節點存在兩種結構:

  1. 葉子節點:直接包含文本值(如 RLT_FLAG)
  2. 容器節點:包含子元素 <DBSET>(如 TASK_TAIL)

通用遍歷代碼無法直接處理,需按節點屬性 N 區分邏輯。

分類解析策略

Element root = document.getRootElement();
parseDBSET(root);

void parseDBSET(Element dbset) {
  for (Element r : dbset.elements("R")) {
    for (Element c : r.elements("C")) {
      String name = c.attributeValue("N");
      if (c.elements().isEmpty()) {
        // 類型 1:葉子節點,直接取文本
        String value = c.getTextTrim();
        handleLeaf(name, value);
      } else {
        // 類型 2:容器節點,遞歸解析嵌套 DBSET
        Element nested = c.element("DBSET");
        if (nested != null) parseDBSET(nested);
      }
    }
  }
}

關鍵點

  • 用 elements().isEmpty() 判斷是否有子元素
  • 根據 N 屬性值分派不同處理邏輯
  • 遞歸處理任意深度嵌套

最佳實踐建議

  1. 定義明確的 XML Schema (XSD) 規範結構,避免此類「非標準」設計
  2. 若無法改動 XML 來源,封裝專用解析器類,隔離複雜度
  3. 單元測試覆蓋各種節點結構變體

面對不規範 XML,「分類處理 + 遞歸下潛」是通用套路。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved