在R中提取XML sqlQuery,轻松提取CLOB列中的所有变量

时间:2020-10-25 20:33:19

标签: r xml oracle clob rodbc

我有一个名为CRS.CRS_FILES的oracle数据库表,其中有一个名为FILE_DATA的列-其中CLOB列是一个大型XML字符串。

supply_conversion_chart

以下是模式的前几行:

FILE_DATA   FILE_CREATION_DATE
<?xml version="1.0" encoding="utf-8"?><REPORT   1/1/2020
<?xml version="1.0" encoding="utf-8"?><REPORT   1/5/2020
<?xml version="1.0" encoding="utf-8"?><REPORT   1/6/2019
<?xml version="1.0" encoding="utf-8"?><REPORT   1/1/2020
<?xml version="1.0" encoding="utf-8"?><REPORT   1/5/2020

我可以使用以下命令在R中进行查询:

CREATE TABLE CRS.CRS_FILES ( FILE_DATA CLOB );

INSERT INTO CRS.crs_files VALUES (
'<?xml version="1.0" encoding="utf-8" ?>
<REPORT xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/CrashReport.DataLayer.v20170201">
  <CRSREPORTTIMESTAMP>2020-10-08T06:49:31.813812</CRSREPORTTIMESTAMP>-
  <AGENCYIDENTIFIER>MILWAUKEE</AGENCYIDENTIFIER>-
  <AGENCYNAME>Milwaukee Police Department</AGENCYNAME>
</REPORT>'
)

输出:

query_string2 <- "SELECT x.agencyname
FROM   CRS.CRS_FILES c
       CROSS JOIN XMLTABLE(
         XMLNAMESPACES(
           'http://www.w3.org/2001/XMLSchema-instance' AS \"i\",
           DEFAULT 'http://schemas.datacontract.org/2004/07/CrashReport.DataLayer.v20170201'
         ),
         '/REPORT'
         PASSING XMLTYPE( c.file_data )
         COLUMNS
           crsreporttimestamp TIMESTAMP     PATH 'CRSREPORTTIMESTAMP',
           agencyidentifier   VARCHAR2(50)  PATH 'AGENCYIDENTIFIER',
           agencyname         VARCHAR2(100) PATH 'AGENCYNAME'
       ) x"

idtable <- sqlQuery(ch,query_string2, max=10)

我需要什么:

没有指定每个变量和路径(所有变量都在REPORT的节点/子注释中,但是有数百个)。如何构造这样的查询,这样就不必列出所有变量(例如我如何通过上面传递的XMLtype在查询中添加| AGENCYNAME | | :-------------------------- | | Milwaukee Police Department | agencyidentifier)。这种方法必须可行(在R中查询)。谢谢。

仅提供上下文,这是一些我需要添加的子节点示例,它显示了有多少个不同的组

agencyname

如果您想尝试一些操作,这里是另一位用户创建的小提琴:

   report_no VARCHAR(35)     PATH '/VEHICLEs/CRSVEHICLE/PASSENGERs/PASSENGER/PERSON/REPORTNUMBER',
   person_id VARCHAR(50)     PATH '/VEHICLEs/CRSVEHICLE/PASSENGERs/PASSENGER/PERSON/PERSONID',
   vehicle_id VARCHAR(50)     PATH '/VEHICLEs/CRSVEHICLE/PASSENGERs/PASSENGER/VEHICLEID'

https://dbfiddle.uk/?rdbms=oracle_18&fiddle=abfa4cbbea535f22415a851cb625045e

0 个答案:

没有答案