ホームページ  >  記事  >  Java  >  XML に名前空間が含まれている場合、XPath クエリで名前空間をどのように処理しますか?

XML に名前空間が含まれている場合、XPath クエリで名前空間をどのように処理しますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-11 08:21:03125ブラウズ

How do you handle namespaces in XPath queries when your XML contains them?

XML に名前空間が含まれる場合の Java での XPath クエリ

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。