0

すべてのノードに CDATA タグが必要な大きな XML ファイルがあります。

<root>
    <a>
        <id>my_id</id>
        <tr><![CDATA[This is the data]]></tr>
    </a>
    <b>
        ...
    </b>
</root>

すべてのノードに CDATA を配置しないようにするにはどうすればよいですか? DTDまたはスキーマはこれに対する方法を提供しますか?

この要件の理由は、ローカリゼーションを目的とした社内フレームワークに由来します。メッセージを含むすべてのタグは、非常に頻繁に特殊文字が含まれているため、CDATA 化する必要があります。私が書いた XML はデモンストレーションのみを目的としており、私が扱う実際のデータを表すものではありません。

4

3 に答える 3

1

すべてのノードにCDATAを配置しないようにするにはどうすればよいですか?DTDまたはスキーマはこのための方法を提供しますか?

いいえ...DTDまたはスキーマは問題の解決にはなりません。

この要件の理由は、社内のフレームワークにあります

もちろん...ドキュメントを解析するXMLパーサーは、セクションがCDATAセクションであるかどうかを認識しています。これは、インターフェイスCDATASectionインターフェイスTextを区別することによってDOMでも表されます。したがって、XMLパーサーを作成する人にとって、プレーンテキストセクションの代わりにCDATAセクションの使用を強制するのは非常に簡単です。ケースの99.9%で、これは明らかに愚かであり、それをチェックするべきではありません。しかし一方で、私は私の人生で非常に多くの愚かなことを見てきました。あなたの社内フレームワークがまさにそれを行い、CDATAセクションの存在を強制してもまったく驚かないでしょう。

これが当てはまる場合(試してみてください)、CDATAセクションを作成し、それに満足する必要があります。結局のところ、それに満足できない場合は、これらのCDATAセクションを追加してXMLを変換するスクリプトを作成できます。

于 2012-05-20T19:25:00.220 に答える
1

メッセージを含むすべてのタグは、特殊文字が含まれていることが非常に多いため、CDATA 化する必要があります。

本当の目的が XML ドキュメントで特殊文字を表現することである場合、問題はこれらの文字の解析ではなく、エンコーディングにあります。

CDATA

<![CDATA[ your data ]]>

主に、(XML) ドキュメントの一部のコンテンツを解析する必要がないという事実を扱います。そうしないと、いくつかのエラーが検出される可能性があります。例は次のとおりです。

    <a>
            <id>my_id</id>
            <tr>& content a </tr>
            <tr> < content b < </tr>
   </a>

ドキュメントが解析されると、そのコンテンツ (つまり、タグ内のテキスト) も解析されます。両方のコンテンツ

&コンテンツ

< 内容 b <

文字「&」と「<」が原因で、解析エラーと見なされます。それを避けるために、一部のコンテンツを解析したくありません。そのため、パーサーにそれらの解析を控えるように指示するために、タグで宣言します。

DTD と XSD はすべて、XML ドキュメントの構造を定義するためのものであり、文字をエンコードする方法を明示的に提供するものではありません (XSD のみがそれを行いますが、バイナリ データ要素の種類に対しては行いません)。これらは、XML ドキュメントが使用される要素の型 (String、Int、Double など) を定義するのに役立ちますが、エンコーディングの問題はあなたに任せます。

これは、解析の問題ではなく、明らかにエンコーディングの問題です。

于 2012-05-20T21:24:52.820 に答える
1

CDATAはノードのコンテンツに関連し、スキーマ情報はドキュメントの構造に関するものです。特に関係はありません。

ドキュメントを見ると、CDATA要素がそこにある必要はありません。コンテンツに山かっこやその他の特殊文字がある場合に、コンテンツの解析/書き込みを容易にするためだけです。

CDATAセクションを示すには、実際の構文が必要ですCDATA。これは、そうでなければ XML として解釈される文字をサポートすることを目的としているためです。完全な構文は、コンテンツとタグのあいまいさを取り除くためにあります。

于 2012-05-18T21:38:11.757 に答える