如何从XML列在Postgres的一个属性选择数据
问题描述:
我有以下XML内容:如何从XML列在Postgres的一个属性选择数据
<?xml version="1.0" encoding="utf-8"?>
<h:html xmlns="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:jr="http://openrosa.org/javarosa" xmlns:orx="http://openrosa.org/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<h:head>
<h:title>Demo12</h:title>
<model>
<instance>
<uploaded_form_bpdwls id="Demo12">
<formhub>
<uuid/>
</formhub>
<Household_Number/>
<Survey_Name/>
<start/>
<end/>
<meta>
<instanceID/>
</meta>
</uploaded_form_bpdwls>
</instance>
</model>
</h:head>
<h:body>
<input ref="/uploaded_form_bpdwls/Household_Number">
<label>Household Number</label>
</input>
<input ref="/uploaded_form_bpdwls/Survey_Name">
<label>Survey Name</label>
</input>
</h:body>
</h:html>
在上面的XML内容,
体内,有两个输入标签不同的属性(即@ref =“/ uploaded_form_bpdwls/Household_Number”)
我想通过postgresSQL选择表格格式的数据我想要“House Hold”和“Survey Name”作为单独的列。
我不知道如何使用标签的属性来选择数据。
是否有可能在单独的列
选择数据应该是什么选择查询来实现这一目标?
答
是你想要的吗? :
with table1 as (
select $$<?xml version="1.0" encoding="utf-8"?>
<h:html xmlns="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:jr="http://openrosa.org/javarosa" xmlns:orx="http://openrosa.org/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<h:head>
<h:title>Demo12</h:title>
<model>
<instance>
<uploaded_form_bpdwls id="Demo12">
<formhub>
<uuid/>
</formhub>
<Household_Number/>
<Survey_Name/>
<start/>
<end/>
<meta>
<instanceID/>
</meta>
</uploaded_form_bpdwls>
</instance>
</model>
</h:head>
<h:body>
<input ref="/uploaded_form_bpdwls/Household_Number">
<label>Household Number</label>
</input>
<input ref="/uploaded_form_bpdwls/Survey_Name">
<label>Survey Name</label>
</input>
</h:body>
</h:html>$$::xml as xml_content
)
select myarray[1] val1,myarray[2] val2 from (
select xpath('/h:html/h:body/i:input/i:label/text()',xml_content,ARRAY[ARRAY['h','http://www.w3.org/1999/xhtml'],ARRAY['i','http://www.w3.org/2002/xforms']]) myarray from table1
) a
对于多层次试试这个:
with table1 as (
select $$<?xml version="1.0" encoding="utf-8"?>
<h:html xmlns="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:jr="http://openrosa.org/javarosa" xmlns:orx="http://openrosa.org/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<h:head>
<h:title>Demo12</h:title>
<model>
<instance>
<uploaded_form_bpdwls id="Demo12">
<formhub>
<uuid/>
</formhub>
<Household_Number/>
<Survey_Name/>
<start/>
<end/>
<meta>
<instanceID/>
</meta>
</uploaded_form_bpdwls>
</instance>
</model>
</h:head>
<h:body>
<div>
<input ref="/uploaded_form_bpdwls/Household_Number">
<label>Household Number</label>
</input>
<input ref="/uploaded_form_bpdwls/Survey_Name">
<label>Survey Name</label>
</input>
</div>
<div>
<input ref="/uploaded_form_bpdwls/Household_Number">
<label>Household Number2</label>
</input>
<input ref="/uploaded_form_bpdwls/Survey_Name">
<label>Survey Name2</label>
</input>
</div>
</h:body>
</h:html>$$::xml as xml_content
)
select myarray[1] val1,myarray[2] val2 from (
select xpath('/i:div/i:input/i:label/text()',xml_content,ARRAY[ARRAY['h','http://www.w3.org/1999/xhtml'],ARRAY['i','http://www.w3.org/2002/xforms']]) myarray from
(
select unnest(xpath('/h:html/h:body/i:div',xml_content,ARRAY[ARRAY['h','http://www.w3.org/1999/xhtml'],ARRAY['i','http://www.w3.org/2002/xforms']])) xml_content from table1
) div
) a
感谢雷米......这正是我需要大约... –
我需要您提供更多的帮助:请解释为什么你已经在xpath中使用了前缀...以及它如何用于多级数据... –
因为在你的xml中,命名空间被定义为:xmlns =“http://www.w3.org/2002/xforms”没有前缀和xmlns:h =“http://www.w3.org/1999/xhtml”,前缀为“h”,如果你没有定义和使用前缀xpath查询返回什么(空数组) –