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
于 2012-04-25T21:55:58.500 回答
2

我不是 libxml 专家。然而,这是我在玩了你的 xml 和 libxml 之后可以弄清楚的。CDATA 是一个节点/部分,不是文本的一部分。下面的代码深入一层,为 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 回答