2016-06-21 41 views
1

我有以下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”作为单独的列。

  • 我不知道如何使用标签的属性来选择数据。

是否有可能在单独的列

选择数据应该是什么选择查询来实现这一目标?

回答

1

是你想要的吗? :

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 
+0

感谢雷米......这正是我需要大约... –

+0

我需要您提供更多的帮助:请解释为什么你已经在xpath中使用了前缀...以及它如何用于多级数据... –

+0

因为在你的xml中,命名空间被定义为:xmlns =“http://www.w3.org/2002/xforms”没有前缀和xmlns:h =“http://www.w3.org/1999/xhtml”,前缀为“h”,如果你没有定义和使用前缀xpath查询返回什么(空数组) –