2

私は問題があります。内部に CDATA と reqular xml ノードの両方を持つノードをランダムに含む xml ファイルがいくつかあります。これらのノードのコンテンツを読み取る必要がありますが、ノードが通常の xml ノードであるか、CDATA ノードであるか、または先頭と末尾の CDATA 部分に含まれる可能性のある両方が混在するノードであるかを判断する方法がわかりません。なんでも。(役立つ場合は、xPathを使用してノードを参照しています)

ノードのテキスト コンテンツを取得するために使用される行:

contentObj.text = contentNode.selectSingleNode("./text").text;

問題の原因となっている xml の例:

<text>
     <![CDATA[<P align=center>&nbsp;</P>
          <P align=center>]]>
     <media identifier="005896523">
          <label>
               <![CDATA[NOTE]]>
          </label>
          <description>
               <![CDATA[Image for NOTE]]>
          </description>
          <comments>Update Required</comments>
     </media>
    <![CDATA[</P>
       <P>&nbsp;</P>
       <P align=left>&nbsp;</P>]]>
</text>
4

1 に答える 1

1

あなたが言う時

contentNode.selectSingleNode("./text")

これはもちろん<text>要素ノードを返します。しかし、あなたが

.text

それのプロパティでは、要素全体のテキスト コンテンツを求めています<text>。これは、そのすべての子孫テキスト ノードの値を連結したものです。

単一のテキストノードを選択したい場合は、試してください

contentNode.selectSingleNode("./text/text()[1]").text;

つまり、要素の最初のテキスト ノードの子を選択し、<text>そのテキスト プロパティを取得します。それは"<P align=center>&nbsp;</P> <P align=center>"あなたの例で(XMLツリーではなく、解析されていないテキストとして)あなたを与えるはずです。

CDATA と非 CDATA を区別するには、それらを区別できるように設計されていない XPath を回避する必要があります。一方、XML DOM は、少なくとも一部の実装では可能です。だからあなたは試すことができます

var children = contentNode.selectNodes("./text/node()");

これにより、テキスト ノード、要素ノード、場合によっては CDATA ノードを含むnodeList、要素のすべての子が選択されます。<text>のノードを反復処理し、childrenそれらのプロパティをチェックして、 、 、またはその他nodeTypeのものであるかどうかを確認します。NODE_CDATA_SECTIONNODE_TEXT

状況と、さらにサポートが必要かどうかをお知らせください。

編集

あなたがこの回答を受け入れたという事実から、あなたは物事を機能させることができたと思います。あなたができてよかったです。

ただし、@choroba がほのめかしていた警告を強調せずにこれを手放したくはありません。CDATA ラッパー (テキストのチャンクを囲む) は、ほとんどの XML ツールからは見えません (ただし、テキスト コンテンツは表示されます)。XML データ モデル (ここで非公式に説明されています) は、CDATA セクションについて何も知りません。XML Infoset の標準では、CDATA でマークされたセクションの境界に関する情報が明示的に省略されています。

したがって、今回は「幸運」でしたが、CDATA セクションに関する情報を提供する XML DOM を使用していたという点で、その情報に依存して重要なデータを XML でエンコードすることは、XML の精神に反する (したがって賢明ではありません) ことになります。そのため、その情報を別の方法でエンコードすることをお勧めします。そうしないと、データに対して他の XML ツールを使用する必要が生じた場合に、行き詰まる可能性があります。

ここで抽出しようとしている重要な情報は、CDATA セクションのテキストがエスケープされたマークアップであるという事実だと思います。たとえば、XML ツリーの一部であることが想定されていない (またはできない) HTML タグの断片です。そのため、それぞれをカスタム要素で囲むことで、その識別をエンコードできます。

<text>
     <escaped><![CDATA[<P align=center>&nbsp;</P>
          <P align=center>]]></escaped>
     <media identifier="005896523">
     ...

後でこれらのセクションを見つけるには、 という名前の要素を探すだけです<escaped>。これは、どの XML ツールでも簡単で自然な作業です。

これらの XML ファイルの設計があなたの管理下にあるかどうかはわかりません。そうでない場合は、少なくともデザイナーにフィードバックを送信するオプションが必要です。XML に精通していない設計者が設計上の誤りを犯した場合、それを修正するか、少なくとも将来の設計で同じ誤りを回避できるように、それを知ることは彼らにとって最善の利益となります。コマンド チェーンの下で作業していて、XML の設計者が別の部門にいる場合、フィードバックの適切なルートは監督者を通じてである可能性があります。移植性のない XML 設計を作成しているかどうかを知ることは、部門の最大の関心事です。

于 2012-10-09T11:11:14.497 に答える