次のXMLでこのオンラインXPathテスターを使用する
<a>foo <![CDATA[ MyCData]]> baz</a>
XPath式を使用すると、/a/text()
すべてのテキストが返されます
foo <![CDATA[ MyCData]]> baz
(これは、を使用してわかるように、3つのノードとして構造化されています。/a/text()[2]
これはを返しますbaz
。)
ただし、 javax.xml.xpath.XPathでは、CDataと最後のテキストノードはまったく返されません。で単一のノードを取得しましたがfoo
、残りのテキスト<![CDATA[ MyCData]]> baz
は利用できません。XPathがXML構造をどのように処理するかに関係なく、ノードにまったくアクセスできない場合はバグです。
ただし、DocumentBuilderFactoryでisCoalescing(true)を設定すると、すべてのテキストノードとCDataノードが1つに連結されます。私はそれを使用することになるかもしれませんが、それはCDataを出力のエスケープされたテキストに変換します。これは、標準で許可されている場合でも、見苦しく見えます。また、「単なる」テキストノードであろうと、特別なタイプのCDataノードであろうと、CDataをある種のノードとして個別にアドレス指定できるようにしたいと思います。
ちなみに、CDataがその親要素の唯一のコンテンツであり、前にスペースやその他のテキストがない場合、通常のテキストコンテンツXPathは、デフォルト(false )のisCoalescingを使用しても、CDataを正常に取得します。したがって、Java XPathは常に最初の、そして最初のテキストノードのみを返していることがわかります。
デフォルトでisCoalescingを使用してDOMドキュメントの完全なDOMツリーを調べると、CDataセクションがタイプcdata-sectionの独自のノードとして表されていることがわかります。これはすばらしいことですが、XPathでこのノードにアクセスするにはどうすればよいですか。