あなたが言う時
contentNode.selectSingleNode("./text")
これはもちろん<text>
要素ノードを返します。しかし、あなたが
.text
それのプロパティでは、要素全体のテキスト コンテンツを求めています<text>
。これは、そのすべての子孫テキスト ノードの値を連結したものです。
単一のテキストノードを選択したい場合は、試してください
contentNode.selectSingleNode("./text/text()[1]").text;
つまり、要素の最初のテキスト ノードの子を選択し、<text>
そのテキスト プロパティを取得します。それは"<P align=center> </P> <P align=center>"
あなたの例で(XMLツリーではなく、解析されていないテキストとして)あなたを与えるはずです。
CDATA と非 CDATA を区別するには、それらを区別できるように設計されていない XPath を回避する必要があります。一方、XML DOM は、少なくとも一部の実装では可能です。だからあなたは試すことができます
var children = contentNode.selectNodes("./text/node()");
これにより、テキスト ノード、要素ノード、場合によっては CDATA ノードを含むnodeList
、要素のすべての子が選択されます。<text>
のノードを反復処理し、children
それらのプロパティをチェックして、 、 、またはその他nodeType
のものであるかどうかを確認します。NODE_CDATA_SECTION
NODE_TEXT
状況と、さらにサポートが必要かどうかをお知らせください。
編集
あなたがこの回答を受け入れたという事実から、あなたは物事を機能させることができたと思います。あなたができてよかったです。
ただし、@choroba がほのめかしていた警告を強調せずにこれを手放したくはありません。CDATA ラッパー (テキストのチャンクを囲む) は、ほとんどの XML ツールからは見えません (ただし、テキスト コンテンツは表示されます)。XML データ モデル (ここで非公式に説明されています) は、CDATA セクションについて何も知りません。XML Infoset の標準では、CDATA でマークされたセクションの境界に関する情報が明示的に省略されています。
したがって、今回は「幸運」でしたが、CDATA セクションに関する情報を提供する XML DOM を使用していたという点で、その情報に依存して重要なデータを XML でエンコードすることは、XML の精神に反する (したがって賢明ではありません) ことになります。そのため、その情報を別の方法でエンコードすることをお勧めします。そうしないと、データに対して他の XML ツールを使用する必要が生じた場合に、行き詰まる可能性があります。
ここで抽出しようとしている重要な情報は、CDATA セクションのテキストがエスケープされたマークアップであるという事実だと思います。たとえば、XML ツリーの一部であることが想定されていない (またはできない) HTML タグの断片です。そのため、それぞれをカスタム要素で囲むことで、その識別をエンコードできます。
<text>
<escaped><![CDATA[<P align=center> </P>
<P align=center>]]></escaped>
<media identifier="005896523">
...
後でこれらのセクションを見つけるには、 という名前の要素を探すだけです<escaped>
。これは、どの XML ツールでも簡単で自然な作業です。
これらの XML ファイルの設計があなたの管理下にあるかどうかはわかりません。そうでない場合は、少なくともデザイナーにフィードバックを送信するオプションが必要です。XML に精通していない設計者が設計上の誤りを犯した場合、それを修正するか、少なくとも将来の設計で同じ誤りを回避できるように、それを知ることは彼らにとって最善の利益となります。コマンド チェーンの下で作業していて、XML の設計者が別の部門にいる場合、フィードバックの適切なルートは監督者を通じてである可能性があります。移植性のない XML 設計を作成しているかどうかを知ることは、部門の最大の関心事です。