2

次のXMLが与えられます:

<?xml version="1.0" encoding="utf-8" ?> 
<Request>
    <form_submit>
        <form_submit id = 1424>
            <form_id>1424</form_id>
            <field1 id=’5’&gt; <![CDATA[ test   ]]>   </field1>
            <field2 id=’6’&gt; <![CDATA[ test2   ]]>   </field2>
        </form_submit>
    </form_submit>
</Request>

field1要素とfield2要素の生の値を取得しようとしています。私は次のコードを使用しています:

foreach my $node ( $xml_request->findnodes('Request/*/*/*[@id]') )
{
    my $form_field_value = $node->textContent;
    print "Value:\"$form_field_value\"\n";
}

しかし、出力は次のとおりです。

Value:" test   "
Value:" test2  "

すべての特殊文字を使用して、生およびそのままの正確なデータを取得するにはどうすればよいですか?そのため、出力は次のようになります。

Value:" <![CDATA[ test   ]]>   "
Value:" <![CDATA[ test2   ]]>   "

ありがとうございました。

4

2 に答える 2

2

libxml の専門家ではありません。しかし、これはあなたの xml と libxml を少しいじった後に私が理解できることです。CDATA はノード/セクションであり、テキストの一部ではありません。以下のコードは 1 レベル深くなり、cdata 子ノードに対して toString() を実行し、他のノードに対して textContent を実行します。

foreach my $node ( $xml_request->findnodes('Request/*/*/*[@id]') )
{
    my $text;
    if($node->childNodes) {
        foreach my $child ($node->childNodes()) {
            if ($child->nodeType == XML::LibXML::XML_CDATA_SECTION_NODE) {
                $text .= $child->toString;
            } else {
                $text .= $child->textContent;
            }
        }
    } else {
        $text = $node->textContent;
    }
    print qq{"$text"\n};
}

印刷します

" <![CDATA[ test   ]]>   "
" <![CDATA[ test2   ]]>   "
于 2012-04-25T20:43:06.213 に答える
2
于 2012-04-25T21:55:58.500 に答える