〇そもそもXPathとは何か
XML Path Language の略。XML文書のツリー構造から特定の要素、属性、その他のノードを選択するためのクエリ言語。HTMLに対しても使える
〇XMLサンプル(いずれも社員管理システム)会社A~会社Dの4つ
company_a.xml~company_d.xml
サンプル1:会社A
company_a.xml
<?xml version="1.0" encoding="UTF-8"?>
<company>
<info>
<name>Alphaソリューションズ株式会社</name>
<founded>2012</founded>
<location country="Japan" city="Tokyo"/>
</info>
<departments>
<department id="d001" name="開発部">
<manager>
<firstName>一郎</firstName>
<lastName>山田</lastName>
</manager>
<employees>
<employee id="e101">
<name>田中太郎</name>
<position>ソフトウェアエンジニア</position>
<skills>
<skill>Java</skill>
<skill>Spring Boot</skill>
<skill>SQL</skill>
</skills>
</employee>
<employee id="e102">
<name>中村花子</name>
<position>フロントエンドエンジニア</position>
<skills>
<skill>JavaScript</skill>
<skill>React</skill>
<skill>TypeScript</skill>
</skills>
</employee>
</employees>
</department>
<department id="d002" name="営業部">
<manager>
<firstName>洋介</firstName>
<lastName>高橋</lastName>
</manager>
<employees>
<employee id="e201">
<name>佐藤健</name>
<position>営業担当</position>
<region>関東</region>
</employee>
<employee id="e202">
<name>小林美咲</name>
<position>営業担当</position>
<region>関東</region>
</employee>
</employees>
</department>
</departments>
</company>
サンプル2:会社B
company_b.xml
<?xml version="1.0" encoding="UTF-8"?>
<company>
<info>
<name>Betaテクノロジーズ株式会社</name>
<founded>2018</founded>
<location country="Japan" city="Osaka"/>
</info>
<departments>
<department id="d001" name="開発部">
<manager>
<firstName>健一</firstName>
<lastName>佐々木</lastName>
</manager>
<employees>
<employee id="e101">
<name>松本翔</name>
<position>ソフトウェアエンジニア</position>
<skills>
<skill>Python</skill>
<skill>Django</skill>
<skill>PostgreSQL</skill>
</skills>
</employee>
<employee id="e102">
<name>鈴木舞</name>
<position>フロントエンドエンジニア</position>
<skills>
<skill>Vue.js</skill>
<skill>JavaScript</skill>
<skill>CSS</skill>
</skills>
</employee>
</employees>
</department>
<department id="d002" name="営業部">
<manager>
<firstName>優</firstName>
<lastName>村上</lastName>
</manager>
<employees>
<employee id="e201">
<name>石田直樹</name>
<position>営業担当</position>
<region>九州</region>
</employee>
<employee id="e202">
<name>藤田葵</name>
<position>営業担当</position>
<region>九州</region>
</employee>
</employees>
</department>
</departments>
</company>
サンプル3:会社C
company_c.xml
<?xml version="1.0" encoding="UTF-8"?>
<company>
<info>
<name>Gammaシステムズ株式会社</name>
<founded>2008</founded>
<location country="Japan" city="Nagoya"/>
</info>
<departments>
<department id="d001" name="開発部">
<manager>
<firstName>隆</firstName>
<lastName>近藤</lastName>
</manager>
<employees>
<employee id="e101">
<name>渡辺大輔</name>
<position>ソフトウェアエンジニア</position>
<skills>
<skill>C#</skill>
<skill>.NET</skill>
<skill>Azure</skill>
</skills>
</employee>
<employee id="e102">
<name>佐々木由美</name>
<position>UI/UXデザイナー</position>
<skills>
<skill>Figma</skill>
<skill>Adobe XD</skill>
<skill>HTML/CSS</skill>
</skills>
</employee>
</employees>
</department>
<department id="d002" name="営業部">
<manager>
<firstName>哲也</firstName>
<lastName>加藤</lastName>
</manager>
<employees>
<employee id="e201">
<name>山口恵</name>
<position>営業担当</position>
<region>中部</region>
</employee>
<employee id="e202">
<name>岡田真</name>
<position>営業担当</position>
<region>関東</region>
</employee>
</employees>
</department>
</departments>
</company>
サンプル4:会社D
company_d.xml
<?xml version="1.0" encoding="UTF-8"?>
<company>
<info>
<name>Deltaネットワークス株式会社</name>
<founded>2015</founded>
<location country="Japan" city="Fukuoka"/>
</info>
<departments>
<department id="d001" name="開発部">
<manager>
<firstName>亮</firstName>
<lastName>石井</lastName>
</manager>
<employees>
<employee id="e101">
<name>村田翔子</name>
<position>モバイルアプリエンジニア</position>
<skills>
<skill>Swift</skill>
<skill>Kotlin</skill>
<skill>Flutter</skill>
</skills>
</employee>
<employee id="e102">
<name>長谷川優</name>
<position>バックエンドエンジニア</position>
<skills>
<skill>Go</skill>
<skill>Docker</skill>
<skill>Kubernetes</skill>
</skills>
</employee>
</employees>
</department>
<department id="d002" name="営業部">
<manager>
<firstName>舞</firstName>
<lastName>高田</lastName>
</manager>
<employees>
<employee id="e201">
<name>木村聡</name>
<position>営業担当</position>
<region>九州</region>
</employee>
<employee id="e202">
<name>原田明</name>
<position>営業担当</position>
<region>九州</region>
</employee>
</employees>
</department>
</departments>
</company>
①〇〇という文字列を内部テキストに含む特定のタグを全て抽出する(特定のタグを仮に<c>とする)
//c[contains(.,'〇〇')]
②(同一の構造・同一のタグをもつ複数のXMLファイルに対して)ある特定のタグが存在する場合に限り、その特定のタグ全てのテキストが「全て」ある特定のテキスト「XXX」である場合にそのXMLファイルを抽出する
unique_toptag_for_xmlfile:各XMLファイルに対して、それぞれ個別に割り当てられているタグ名。もしくはルートノードのタグ名
c:ルートノードより下の階層の各ファイルにおいて共通で使われているあるタグ名
とすると、
/unique_toptag_for_xmlfile[.//c and not(.//c[. != "XXX"])]
/unique_toptag_for_xmlfile[count(.//c) > 0 and every $r in .//c satisfies $r = "XXX"]
※Xpathにもバージョンがあるらしく、前者は「XPath 1.0 ベース(例: XML DB, XSLT 1.0)」後者は「XPath 2.0以上(例: Saxon, BaseX, modern XMLツール)」
公式ドキュメント
今後参考になりそうな資料