Postgres 使用 xpath_table 解析 xmlnamespaces

Postgres use xpath_table parsing with xmlnamespaces

我可以使用 xpath_table 解析 xmlnamespaces

drop table if exists _xml;
create temporary table _xml  (fbf_xml_id serial,str_Xml xml);

insert into _xml(str_Xml)
select  '<DataSet1  xmlns="http://tempuri.org/DataSet_LocalMaMC.xsd">
  <Stations>
    <ID>5</ID>
  </Stations>
  <Stations>
    <ID>1</ID>
  </Stations>
  <Stations>
    <ID>2</ID>
  </Stations>
  <Stations>
    <ID>10</ID>
  </Stations>
  <Stations>
    <ID/>
  </Stations>
  </DataSet1>' ;


drop table if exists _y;
create temporary table _y as
SELECT * 
FROM xpath_table('FBF_xml_id','str_Xml','_xml',
              '/DataSet1/Stations/ID',
              'true') AS t(FBF_xml_id int,ID text);
select * from _y

如果我使用 xml 命名空间,它工作正常。 我想用 Xpath 工作,但是当有 null 时,它会给我错误的结果。

对于 Postgres 10 或更高版本,xmltable() 是执行此操作的首选方法。

您可以使用它轻松指定命名空间列表。

SELECT fbf_xml_id, xt.id
FROM _xml
  cross join 
      xmltable(xmlnamespaces ('http://tempuri.org/DataSet_LocalMaMC.xsd' as x),
               '/x:DataSet1/x:Stations'
               passing str_xml
               columns 
                  id text path 'x:ID') as xt

请注意,在用于 xmltable() 函数的 XPath 表达式中,标签以 xmlnamespaces 选项中定义的命名空间别名为前缀,即使它们在输入 XML.

Online example