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