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

Java 中使用 XPath 處理含命名空間的 XML 文件

     編輯:J2EE

挑戰:命名空間導致 XPath 無法直接匹配

XML 若宣告命名空間(如 xmlns:ML="MREML"),直接寫 //EnvelopID 會查無節點,因為節點實際屬於 ML 命名空間。需透過兩種方式處理。

方法一:使用 local-name() 忽略命名空間

XPath 內建函數 local-name() 僅比對節點本地名稱,不理會前綴:

//*[local-name()='MREML']/EnvelopEntity/EnvelopID/text()
  • 優點:無需額外程式碼, XPath 獨立完成。
  • 缺點:若不同命名空間有同名節點會誤匹配;效能稍差。

方法二:在 Java 程式中註冊 NamespaceContext

建立 NamespaceContext 實作,將前綴對應到 URI,再設定給 XPath 物件:

public static Node parseXPath(String expr, Object src, QName qname) throws Exception {
    XPath xpath = XPathFactory.newInstance().newXPath();
    xpath.setNamespaceContext(new NamespaceContext() {
        @Override public String getNamespaceURI(String prefix) {
            if ("ML".equalsIgnoreCase(prefix)) return "MREML";
            if ("RMDI".equalsIgnoreCase(prefix)) return "ResourceMetaDataInfo";
            // ... 其他映射
            return null;
        }
        @Override public String getPrefix(String uri) { return null; }
        @Override public Iterator getPrefixes(String uri) { return null; }
    });
    return (Node) xpath.evaluate(expr, src, qname);
}

之後 XPath 可直接使用前綴:

//ML:MREML/ML:EnvelopEntity/ML:EnvelopID/text()

預設命名空間特殊處理

若 XML 使用預設命名空間(xmlns="MREML" 無前綴),仍需在 NamespaceContext 給一個自訂前綴(如 ML)映射到該 URI,XPath 才能寫 //ML:EnvelopID。

建議

  • 簡單一次性查詢用 local-name() 最快。
  • 系統整合、效能敏感、命名空間複雜時,建議註冊 NamespaceContext,確保精確與可維護性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved