从数据库表生成XML

时间:2014-10-02 05:29:50

标签: xml tsql coldfusion coldfusion-10

我有一个没有任何类型的层次结构的表,需要以XML格式输出,然后根据SEQ列中的数字进行格式化和排序。我使用ColdFusion生成XML,因为格式化输出对于TSQL来说有点复杂。我的问题是,我对如何正确使用ColdFusion句柄ID有点遗失,因为我的模板文件中的行数可能超过了。

以下是我与之合作的一般概念:

我的表只有1个ID(我想要这个数千个ID):

MODNM | CARNM | PARTID   | PARNAME  | SEQ | TYPE | VALUE                     | FLAG
-----------------------------------------------------------------------------------
M-880 | HONA  | 29000153 | SETGROUP | 1   | A    | 3                         | P
M-880 | HONA  | 29000153 | *CDMZI   | 2   | A    | F%+A8E=,,,0;+MS=V123,456; | P
M-880 | HONA  | 29000153 | DMTZ     | 3   | A    |                           | P
M-880 | HONA  | 29000153 | CDRFCP   | 4   | A    | 0                         | P
M-880 | HONA  | 29000153 | SETGROUP | 5   | A    | 15                        | P
M-880 | HONA  | 29000153 | #PT      | 5   | 6    | NONE                      | P
M-880 | HONA  | 29000153 | CDH6     | 7   | A    | 100.111.100.44            | P
M-880 | HONA  | 29000153 | CDEPORT  | 8   | A    | 9003                      | P

XML格式必须是:

<Device PartID="29000153" MODNM="M-880">
  <Car Name="HONA">
    <Group GID="3">
      <Pmeter ParName="*CDMZI" Value="F%+A8E=,,,0;+MS=V123,456;" Type="A" Flag="P" />
      <Pmeter ParName="DMTZ" Value="" Type="A" Flag="P" />
      <Pmeter ParName="CDRFCP" Value="0" Type="A" Flag="P" />
    </Group>
    <Group GID="15">
      <Pmeter ParName="#PT" Value="NONE" Type="A" Flag="P" />
      <Pmeter ParName="CDH6" Value="100.111.100.44" Type="A" Flag="P" />
      <Pmeter ParName="CDEPORT" Value="9003" Type="A" Flag="P" />
    </Group>
  </Car>
  <DevFiles />
</Device>

我以下列方式设置ColdFusion以生成XML文件。问题是,当模板文件中存在更多PARNAMES时,我不确切知道如何让ColdFusion动态处理ID。

runXMLgen.cfm - 生成XML文件

  1. CFQUERY从表格中提取所有ID
  2. <cfinclude template>用于xmltmplt.cfm
  3. 使用CFFILE将XML文件存储到本地目录

        SELECT PARTID,PARNAME,VALUE,SEQ,FLAG,TYPE     来自PMETER     在哪里PARTID(&#39; 290000153&#39;)     AND MODNM =&#39; M-880&#39;        和CARNM =&#39; HONA&#39;     由SEQ ASC订购    

    <cfset xmlStartData = "<SData>#chr(13)##chr(10)##chr(32)##chr(32)#<Devices SpecVersion=""1.0"">#chr(13)##chr(10)#" />
    <cffile action="append" addnewline="no" file="C:\extract.xml" output="#xmlStartData#" />
      <Devices SpecVersion="1.0">   
    <cfoutput>
        <cfloop query="bextract">
            <cfinclude template="xmltmplt.cfm" />
            <cffile action="append" addnewline="no" file="C:\extract.xml" output="#bParams#" />
        </cfloop>
    </cfoutput>
      </Devices>
    <cfset xmlEndData = "#chr(32)##chr(32)#</Devices>#chr(13)##chr(10)#</SData>" />
    <cffile action="append" addnewline="no" file="C:\extract.xml" output="#xmlEndData#" />
    

  4. xmltmplt.cfm - 硬编码模板,它应该根据seq顺序自动生成值,并在将setgroup视为parname时启动新模板。下面有点不完整,因为我没有逃避价值观,但这基本上是我坚持的地方。弄清楚如何基于seqorder和某些parnames动态填充XML文件,而无需知道ID可能有多少个parnames。

    <cfset bParams = " <Device PartID="#partID#" MODNM="#modnm">#chr13#
     <Car Name="#carnm#">#chr13#
      <Group GID="#parname#">#chr13#
       <Pmeter ParName="#parname#" Value="#value#" Type="#type#" Flag="#flag#" />#chr13#
       <Pmeter ParName="#parname#" Value="#value#" Type="#type#" Flag="#flag#" />#chr13#
      </Group>#chr13#
      <Group GID="#parname#">#chr13#
       <Pmeter ParName="#parname#" Value="#value#" Type="#type#" Flag="#flag#" />#chr13#
       <Pmeter ParName="#parname#" Value="#value#" Type="#type#" Flag="#flag#" />#chr13#
      </Group>#chr13#
     </Car>#chr13#
     <DevFiles />#chr13#
    </Device> " />
    

1 个答案:

答案 0 :(得分:0)

您可能滥用<cfoutput group="...">并使用它来生成所需的嵌套。它需要对您的查询进行一些小调整才能生成正确的GID分组。这可能不准确,但应该让你开始。 (注意:为了简洁起见,我故意省略XmlFormat,但在实际代码中使用它。

NB: 使用“群组”时,查询结果必须按照与分组完全相同的顺序排序,否则将无法正常工作

<cfquery name="getParts" ....>
   SELECT PARTID
          , MODNUM
          , CARNM
          , ParName
          , VALUE
          , TYPE
          , FLAG
          , CASE WHEN PARNAME = 'SETGROUP' THEN 1 ELSE 0  END AS IsGroupHeader
   FROM   YourTable 
   ORDER BY PARTID
         , CARNM
         , SEQ
         , IsGroupHeader
</cfquery>


<cfsavecontent variable="content"> 
<cfoutput query="getParts" group="PARTID">
<Device PartID="#PARTID#" MODNM="#MODNUM#">
   <cfoutput group="CARNM">
      <Car Name="#CARNM#">
      <cfoutput group="IsGroupHeader">
        <!-- If this is the SETGROUP value, generate opening tag --->   
        <cfif IsGroupHeader>
            <Group GID="#VALUE#">
        <cfelse>
            <cfoutput>
             <Pmeter ParName="#PARNAME#" Value="#VALUE#" Type="#TYPE#" Flag="#FLAG#" />
            </cfoutput>
         </Group>
        </cfif>
     </cfoutput>
     </Car>
   </cfoutput>
</Device></cfoutput>
</cfsavecontent>

<cfdump var="#content#" label="Show generated XML">