在postgresql中获取XML值

时间:2014-06-05 09:47:39

标签: xml postgresql xml-parsing

我在postgres数据库的表格中的一列中有以下xml(它是jira中的工作流程):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE workflow PUBLIC "-//OpenSymphony Group//DTD OSWorkflow 2.8//EN" "http://www.opensymphony.com/osworkflow/workflow_2_8.dtd">
<workflow>
    ...
  <steps>
    <step id="1" name="New">
        ...
    </step>
    <step id="5" name="Resolved">
        ...
    </step>
    <step id="10" name="Closed">
        ...
    </step>
  </steps>
  ...
</workflow>

我想选择映射:

1 - New
5 - Resolved
10 - Closed

如何实现这一目标?我应该使用哪种postgres功能?

2 个答案:

答案 0 :(得分:0)

您需要使用xpath function

select
  unnest(xpath('//workflow/steps/step/@id', xmlin)),
  unnest(xpath('//workflow/steps/step/@name', xmlin))
from
  (select xmlparse(document '<?xml version="1.0"?>
  <!DOCTYPE workflow PUBLIC "-//OpenSymphony Group//DTD OSWorkflow 2.8//EN" "http://www.opensymphony.com/osworkflow/workflow_2_8.dtd">
<workflow>
  <steps>
    <step id="1" name="New">
    </step>
    <step id="5" name="Resolved">
    </step>
    <step id="10" name="Closed">
    </step>
  </steps>
</workflow>') xmlin) x

----
1;New
5;Resolved
10;Closed

注意 - 正如@posz所指出的那样,如果缺少nameid属性,这将无法使用。

答案 1 :(得分:0)

要处理xml节点,您可以使用xpath()功能:

with v(x) as (
  select xmlparse(document '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE workflow PUBLIC "-//OpenSymphony Group//DTD OSWorkflow 2.8//EN" "http://www.opensymphony.com/osworkflow/workflow_2_8.dtd">
<workflow><steps><step id="1" name="New"/><step id="5" name="Resolved"/><step id="10" name="Closed"/></steps></workflow>')
)
select (xpath('@id', step))[1] as id, (xpath('@name', step))[1] as name
from v
cross join lateral unnest(xpath('/workflow/steps/step', x)) as step

结果列将按键入xml,因此可能需要进行投射。