4

次のような CDATA セクションを持つ単純な XML があります。

<?xml version="1.0" encoding="ISO-8859-1" ?>
<config>
    <input>
    <![CDATA[
line
another line
and another
    ]]>
    </input>
    ...
</config>

そして、MSXML を使用して CDATA セクションを解析するための現在のコードがあります。

for (int i = 0, count = pChildNodes->Getlength(); i < count; ++i) {
    IXMLDOMNodePtr pNode = pChildNodes->Getitem(i);
    if (pNode->GetnodeType() != NODE_COMMENT && pNode->GetnodeType() != NODE_TEXT) {
        if (pNode->GetnodeType() == NODE_CDATA_SECTION) {
            IXMLDOMCDATASectionPtr pCData = pNode;
            _bstr_t a = pCData->Getdata();
            _variant_t b = pCData->GetnodeValue();
            _bstr_t c = pCData->Gettext();
            _bstr_t d = pCData->Getxml();

ただし、、、aまたはXMLbにある改行は保持されません。そして、これは出力です:cd

lineanother lineand another

ドキュメントを作成するときに、空白を保持するフラグを設定します。

m_pXmlDoc->put_preserveWhiteSpace(VARIANT_TRUE);

改行を考慮して CDATA セクションの値を取得する方法について何か考えはありますか?

4

2 に答える 2

0

データをXMLドキュメントに保存する前に、Base64のようなものでデータをエンコードしてみませんか?そうすれば、CDATAタグも必要ありません。値を取得するときにBase64でデコードするだけで、元のデータがすべて保持されます。

このソリューションには2つの欠点があります。

  1. 保存されるデータは少し大きくなります(Base 64バイトとして)
  2. XMLファイルのプレーンテキストの可読性が明らかに失われます(Base 64でエンコードされるため)

もちろん、良い点です。CDATAの問題について心配する必要はありません。これは、状況の悪い点を上回っていることを願っています。

urlエンコード、htmlエンコード、およびスラッシュの追加はすべて代替手段であり、実装するには追加の作業が必要になりますが、サイズが小さくても読みやすさは損なわれません。

乾杯

于 2009-02-21T20:55:49.950 に答える
0

CDATA が空白を保持することになっているとは思いません。通常、< や > などの文字をエスケープするために使用されます。http://www.javacommerce.com/displaypage.jsp?name=whitespa.sql&id=18238これが役立つかもしれません。

于 2009-02-20T23:02:30.217 に答える