XPath を使用した Java での名前空間を使用した XML のクエリ
名前空間にバインドされた要素を含む XML ドキュメントを操作する場合、XPath を使用したクエリは困難になることがあります。次の例を考えてみましょう:
「/workbook/sheets/sheet[1]」のようなデフォルトの「名前空間なし」XPath 式を使用すると失敗します。これは、XML ドキュメント内の要素が名前空間にバインドされており、XPath 式では考慮されないためです。
解決策 1: 名前空間を登録し、名前空間プレフィックスを使用する
推奨されるアプローチは、名前空間プレフィックスを使用して名前空間を登録し、XPath の読み取りと保守を容易にすることです。
NamespaceContext namespaceContext = new NamespaceContext() { @Override public String getNamespaceURI(String prefix) { if (prefix.equals("main")) { return "http://schemas.openxmlformats.org/spreadsheetml/2006/main"; } else if (prefix.equals("r")) { return "http://schemas.openxmlformats.org/officeDocument/2006/relationships"; } return null; } }; XPathFactory xPathFactory = XPathFactory.newInstance(); XPath xPath = xPathFactory.newXPath(); xPath.setNamespaceContext(namespaceContext); NodeList nodes = (NodeList) xPath.evaluate("/main:workbook/main:sheets/main:sheet[1]", document, XPathConstants.NODESET);
名前空間プレフィックスを使用すると、XPath 式は次のようになります。 「/main:workbook/main:sheets/main:sheet[1]」。指定された名前空間にバインドされた要素を正しくアドレス指定します。
解決策 2: 一般的な一致と述語フィルター
あるいは、要素の一般的な一致と、必要な local-name() および namespace-uri():
XPathFactory xPathFactory = XPathFactory.newInstance(); XPath xPath = xPathFactory.newXPath(); NodeList nodes = (NodeList) xPath.evaluate("/*[local-name()='workbook' and namespace-uri()='http://schemas.openxmlformats.org/spreadsheetml/2006/main']" "/*[local-name()='sheets' and namespace-uri()='http://schemas.openxmlformats.org/spreadsheetml/2006/main']" "/*[local-name()='sheet' and namespace-uri()='http://schemas.openxmlformats.org/spreadsheetml/2006/main'][1]", document, XPathConstants.NODESET);
このメソッドは冗長であり、XML ドキュメント内に語彙が混在している場合はリスクが生じる可能性があります。
結論
名前空間を含む XML ドキュメントを扱う場合は、名前空間のバインディングを考慮することが重要です。名前空間をプレフィックスで登録するか、一般的な XPath 式を慎重に作成することにより、正確で信頼性の高いクエリを実行できます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3