如何让 Nokogiri 在 < 和 > 中用 CDATA 解析 XML

How to get Nokogiri to parse XML with CDATA in &lt; and &gt;

我有一个包含以下内容的 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 对它们做任何事情。

您的输入包含转义的 <> 个字符(&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")))