xpath作为函数的不同结果和创建表时的xpath

时间:2018-03-28 12:52:29

标签: xml xpath hive

我有一个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导出的。

1 个答案:

答案 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无法区分它们的事实并不意味着没有其他人可以。在您的情况下,差异不是选择节点,而是它们之后的显示方式。