如何让 Nokogiri 在 < 和 > 中用 CDATA 解析 XML
How to get Nokogiri to parse XML with CDATA in < and >
我有一个包含以下内容的 XML 文件:
<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>
我尝试用 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[
”?
我认为这都是关于实体 <
和 >
而不是 <
和 >
,但我无法让 Nokogiri 对它们做任何事情。
您的输入包含转义的 <
和 >
个字符(<
和 >
)。当您使用字符而不是 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")))
我有一个包含以下内容的 XML 文件:
<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>
我尝试用 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[
”?
我认为这都是关于实体 <
和 >
而不是 <
和 >
,但我无法让 Nokogiri 对它们做任何事情。
您的输入包含转义的 <
和 >
个字符(<
和 >
)。当您使用字符而不是 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")))