从数据库表生成XML

从数据库表生成XML,xml,tsql,coldfusion,coldfusion-10,Xml,Tsql,Coldfusion,Coldfusion 10,我有一个没有任何层次结构类型的表,需要以XML输出,然后根据SEQ列中的数字进行格式化和排序。我使用ColdFusion生成XML,因为格式输出对于TSQL来说有点复杂。我的问题是,在模板文件中可能有超过行数的行时,我有点不知道如何正确地使用ColdFusion句柄ID 以下是我工作的总体思路: 我的表只有一个ID我想要这个用于数千个ID: MODNM | CARNM | PARTID | PARNAME | SEQ | TYPE | VALUE |

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

以下是我工作的总体思路:

我的表只有一个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>
xmltmplt.cfm—硬编码模板,该模板应根据seq order自动生成值,并在将setgroup视为parname时启动new。下面有点不完整,因为我并没有逃避值,但这基本上就是我所停留的地方。了解如何基于seqorder和某些parname动态填充XML文件,而不知道一个ID可能有多少parname

<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> " />
您可能会滥用并使用它来生成所需的嵌套。为了生成正确的GID分组,需要对查询进行一些小的调整。这可能不准确,但应该让你开始。注意:为了简洁起见,我特意省略了XmlFormat,但请在实际代码中使用它

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


您需要发布显示如何生成当前xml的代码。听起来好像是硬编码的。您是否尝试过使用cfoutput group=。。?它需要几个组,但如果结构正确,您可以使用它生成未知数量的PARNAMES元素。使用stackoverflow的格式发布代码时存在严重的语言问题。即使缩进了4个空格,我的代码在发布时也会被剥离。有什么想法吗?愚蠢的问题。您确定它不仅仅被视为文本吗?这可能会导致cfml消失,因为浏览器将其视为html标记,所以它不会显示。还有,你有没有试过代码按钮ie{}。现在更新我帖子上的所有内容。xmltmplt.cfm文件不完整,但它应该可以让我了解我现在正在做什么,并寻找如何更好地完成这项工作的建议或解决方案,因为某些ID可能具有未知数量的组和名称。谢谢Leigh,我今天将尝试一下并更新结果。再想一想,这并不能完全奏效。查看我更新的响应。PARNAME的值实际上没有出现,而布尔值显示为0。我怎样才能得到parname的实际值呢?编辑对我来说很好。它生成ParName=*CDMZI等。也许你的问题和我的不同?您是否将该列包括在选择列表中?请参阅上面我更新的查询。好的,就是这样。我不明白,我做了同样的事情,但在SELECT语句中的顺序不同。这就是我有问题的原因吗?
<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> " />
<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">