次の例のように、XML に名前空間が含まれる場合:
<?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 クエリを使用すると問題が発生する可能性があります。これは、要素が名前空間にバインドされており、XPath がデフォルトの匿名名前空間で要素を探しているためです。
があります。 XPath クエリで名前空間を処理する複数の方法:
推奨される方法は、プレフィックスを使用して名前空間を登録することです。これにより、XPath の開発とメンテナンスが簡素化されます:
NamespaceContext namespaceContext = new NamespaceContext() { @Override public String getNamespaceURI(String prefix) { if ("xssf".equals(prefix)) { return "http://schemas.openxmlformats.org/spreadsheetml/2006/main"; } return null; } @Override public String getPrefix(String namespaceURI) { return null; } @Override public Iterator getPrefixes(String namespaceURI) { return null; } }; XPath xpath = XPathFactory.newInstance().newXPath(); xpath.setNamespaceContext(namespaceContext);
この設定では、簡素化された XPath クエリを使用できます:
/xssf:workbook/xssf:sheets/xssf:sheet[1]
名前空間プレフィックスを使用したくない場合は、述語フィルターとの一般的な一致を使用する XPath 式を作成できます。
/*[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]
この方法では、冗長な XPath 式が作成され、実行が困難になる可能性があります。
/*[local-name()='workbook']/*[local-name()='sheets']/*[local-name()='sheet'][1]ローカル名のみで一致させて名前空間を無視することもできます:ただし、このアプローチでは、異なる名前空間で同じローカル名を使用する語彙が混在している場合に、間違った要素を選択する危険があります。
以上がXML に名前空間が含まれている場合、XPath クエリで名前空間をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。