ホームページ > Java > &#&チュートリアル > XPath を使用して Java で名前空間を含む XML をクエリする方法

XPath を使用して Java で名前空間を含む XML をクエリする方法

Susan Sarandon
リリース: 2024-11-17 08:27:03
オリジナル
844 人が閲覧しました

How to Query XML with Namespaces in Java Using XPath?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート