如何使Nokogiri在中使用CDATA解析XML

问题描述 投票:0回答:1

我有一个具有此内容的XML文件:

<DATA>
    <NAME>&lt;![CDATA[FIRSTNAME LASTNAME MIDDLENAME ]]&gt;</NAME>
    <NUM>3731</NUM>
    <person_type>4</person_type>
    <birth_date>&lt;![CDATA[01.11.1992]]&gt;</birth_date>
    <DESCRIPTION>&lt;![CDATA[DESCRIPTION]]&gt;</DESCRIPTION>
</DATA>

我试图用Nokogiri解析它,但是没有CDATA我无法获得内容。

我的解析器脚本:

require 'nokogiri'

doc = Nokogiri::XML(File.open("test2.xml"))
root = doc.root

puts root['DATE']

doc.xpath('//DATA').each do |terr|
  puts "\nName: "+terr.xpath('NAME').text
end

这是我得到的:

Name: <![CDATA[FIRSTNAME LASTNAME MIDDLENAME ]]>

如何去除结果中的“ ![CDATA[”?

我认为这完全是关于实体&lt;&gt;,而不是<>,但我无法让Nokogiri对它们进行任何处理。

ruby-on-rails nokogiri
1个回答
0
投票

您的输入包含转义的<>字符(&lt;&gt;)。当您使用字符而不是HTML实体时,一切都会按预期进行:

input = "<DATA>
    <NAME><![CDATA[FIRSTNAME LASTNAME MIDDLENAME ]]></NAME>
    <NUM>3731</NUM>
    <person_type>4</person_type>
    <birth_date><![CDATA[01.11.1992]]></birth_date>
    <DESCRIPTION><![CDATA[DESCRIPTION]]></DESCRIPTION>
</DATA>"
doc = Nokogiri::XML(input)
doc.xpath('//DATA/NAME').text

=> "FIRSTNAME LASTNAME MIDDLENAME "

doc.xpath('//DATA').each do |terr|
  puts "\nName: "+terr.xpath('NAME').text
end

=> Name: FIRSTNAME LASTNAME MIDDLENAME

要摆脱HTML实体,可以在输入中调用CGI.unescapeHTML

doc = Nokogiri::XML(CGI.unescapeHTML(File.read("test2.xml")))
© www.soinside.com 2019 - 2024. All rights reserved.