3

次の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でこのノードにアクセスするにはどうすればよいですか。

4

1 に答える 1

2

オンラインのXPathテスターが間違っています。恐れ入ります。XPathデータモデルによると、<a>要素には、文字列値が"foo MyCDATA baz";である単一のテキストノードの子があります。2番目のテキストノードがないため、2番目のテキストノードのリクエストは何も返さないはずです。

XPathデータモデルは、CDATAは、特殊文字をエスケープする必要をなくすためのデータ入力の便利な方法にすぎないと考えています。CDATAの存在は、XMLの意味や情報コンテンツに影響を与えないため、アプリケーションで使用できるようにはなりません。

于 2012-08-28T08:17:13.520 に答える