我有一个xml文件。结构是
<ROW>
.....
<COLUMN NAME="CNAL"><![CDATA[R]]></COLUMN>
<COLUMN NAME="ID_STATUS"><![CDATA[9]]></COLUMN>
.....
</ROW>
当我尝试使用函数
解析此行时select xpath(row, '/ROW/COLUMN[@NAME="ID_STATUS"]/text()');
我得到了
9
但是当我在创建表时尝试相同的路径时
create external table db.table(
...
, id_status string
...
)
ROW FORMAT SERDE 'com.ibm.spss.hive.serde2.xml.XmlSerDe'
WITH SERDEPROPERTIES (
...
, "column.xpath.id_status"='/ROW/COLUMN[@NAME="ID_STATUS"]/text()'
...
)
STORED AS
INPUTFORMAT 'com.ibm.spss.hive.serde2.xml.XmlInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
location '/storage/db/db/table'
TBLPROPERTIES (
"xmlinput.start"="<ROW",
"xmlinput.end"="</ROW>"
);
然后选择,我得到
<![CDATA[9]]>
为什么会这样,<![CDATA[]]>
究竟是什么?在create
期间如何摆脱它?
xml是从orale导出的。
答案 0 :(得分:1)
CDATA是一种编写文字内容的方式,其中字符&amp;通常具有特殊含义的&lt;和&lt ;,被解释为代表它们自己。如果你包裹一个像&#39; 9&#39;或者&#39; N&#39; (在CDATA部分没有特殊字符),CDATA部分没有意义,但仍然允许。
XPath规则说<x><![CDATA[NNN]]></x>
与<x>NNN</x>
完全等效(解析后)。 CDATA标记不应该影响XPath表达式的结果。但并非XML系列中的所有规范都同意:有些像DOM一样,即使在解析之后也会保留两种情况之间的区别。
现在,只要XPath表达式在两种情况下选择节点,对于显示XPath表达式结果的软件来说,对于这两种情况,以不同方式显示节点实际上并不是错误的。 XPath无法区分它们的事实并不意味着没有其他人可以。在您的情况下,差异不是选择节点,而是它们之后的显示方式。