XPath を使用して Java で名前空間を使用して XML をクエリする
名前空間にバインドされた要素を含む XML ドキュメントを操作する場合、XPath を使用したクエリは困難になる可能性があります。次の例を考えてみましょう。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"> <sheets> <sheet name="Sheet1" sheetId="1" r:id="rId1"/> </sheets> </workbook>
「/workbook/sheets/sheet[1]」のようなデフォルトの「名前空間なし」XPath 式を使用すると失敗します。これは、XML ドキュメント内の要素が名前空間にバインドされており、XPath 式では考慮されないためです。
解決策 1: 名前空間を登録し、名前空間プレフィックスを使用する
推奨されるアプローチは、名前空間プレフィックスを使用して名前空間を登録することです。これにより、XPath が読みやすくなり、 main:
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: 一般的な一致と述語Filter
または、要素の一般的な一致と、必要な local-name() および namespace-uri() を指定する述語フィルターを使用して、名前空間プレフィックスのない XPath 式を構築できます。
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 内に語彙が混在している場合はリスクが生じる可能性がありますdocument.
結論
名前空間を持つ XML ドキュメントを扱う場合、名前空間のバインディングを考慮することが不可欠です。プレフィックスを使用して名前空間を登録するか、一般的な XPath 式を慎重に作成することで、正確で信頼性の高いクエリを実行できます。
以上がXPath を使用して Java で名前空間を含む XML をクエリする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。