2014-08-31 172 views
1

我有一個在xml類型參數postgresql中的過程。 我需要解析XML並在表中插入記錄。 我試過這種方式,但它只在表中插入一條記錄,其中xml包含三條記錄。postgresql:xml解析:xpath只返回一條記錄,其中xml包含3條記錄

XML代碼是

Select (xpath('/ArrayOfUserGroupModulePermissionBusinessObject/UserGroupModulePermissionBusinessObject/ModuleID/text()', t1))[1]::varchar::BIGINT AS ModuleID 
from (Select Perms::xml as t1) as t2; 

的XML是在這裏

<ArrayOfUserGroupModulePermissionBusinessObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <UserGroupModulePermissionBusinessObject> 
    <UserGroupModulePermissionID>0</UserGroupModulePermissionID> 
    <UserGroupID>0</UserGroupID> 
    <ModuleID>3</ModuleID> 
    <ModuleName>Administration</ModuleName> 
    <CanRead>false</CanRead> 
    <CanAdd>false</CanAdd> 
    <CanEdit>false</CanEdit> 
    <CanDelete>false</CanDelete> 
    <CanPrint>false</CanPrint> 
    </UserGroupModulePermissionBusinessObject> 
    <UserGroupModulePermissionBusinessObject> 
    <UserGroupModulePermissionID>0</UserGroupModulePermissionID> 
    <UserGroupID>0</UserGroupID> 
    <ModuleID>2</ModuleID> 
    <ModuleName>Data Management</ModuleName> 
    <CanRead>false</CanRead> 
    <CanAdd>false</CanAdd> 
    <CanEdit>false</CanEdit> 
    <CanDelete>false</CanDelete> 
    <CanPrint>false</CanPrint> 
    </UserGroupModulePermissionBusinessObject> 
    <UserGroupModulePermissionBusinessObject> 
    <UserGroupModulePermissionID>0</UserGroupModulePermissionID> 
    <UserGroupID>0</UserGroupID> 
    <ModuleID>1</ModuleID> 
    <ModuleName>Reception</ModuleName> 
    <CanRead>false</CanRead> 
    <CanAdd>false</CanAdd> 
    <CanEdit>false</CanEdit> 
    <CanDelete>false</CanDelete> 
    <CanPrint>false</CanPrint> 
    </UserGroupModulePermissionBusinessObject> 
</ArrayOfUserGroupModulePermissionBusinessObject> 

我不知道什麼是錯在這個SQL

回答

2

的XPath函數返回一個數組的元素爲每個結果。您只使用數組中的第一個元素,而數組實際上包含您期望的所有三個元素。使用unnest將數組轉換爲行。

Select unnest(xpath('/ArrayOfUserGroupModulePermissionBusinessObject/UserGroupModulePermissionBusinessObject/ModuleID/text()', t1))::varchar::BIGINT AS ModuleID 
from (Select Perms::xml as t1) as t2; 
+0

正是我在找的東西。萬分感謝。 – 2014-08-31 10:56:15