我有一个没有任何类型的层次结构的表,需要以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文件
CFQUERY
从表格中提取所有ID <cfinclude template>
用于xmltmplt.cfm 使用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#" />
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> " />
答案 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">