2014-10-02 4 views
0

У меня есть таблица без иерархии любого типа, которая должна выводиться в XML, затем отформатирована и упорядочена на основе чисел в столбце SEQ. Я использую ColdFusion для генерации XML, так как вывод форматирования является немного сложным для обработки TSQL. Моя проблема в том, что я немного потерял, как правильно иметь идентификаторы дескрипторов ColdFusion, где может быть больше, чем количество строк, которые у меня есть в файле шаблона.Генерировать XML из таблицы базы данных

Вот общее представление о том, что я работаю с:

Мой стол только 1 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-файл. Проблема в том, что я не знаю точно, как ColdFusion динамически обрабатывает идентификаторы, когда есть больше PARNAMES, чем то, что отложено в файле шаблона.

runXMLgen.cfm - генерирует XML-файл

  1. CFQUERY вытащить все идентификаторы из таблицы
  2. использования <cfinclude template> для xmltmplt.cfm
  3. использования CFFILE для хранения XML-файл в локальный каталог

    ВЫБЕРИТЕ PARTID, PARNAME, VALUE, SEQ, FLAG, TYPE ОТ PMETER WHE RE PartID в ('290000153') И MODNM = 'М-880' И CARNM = 'Hona' ORDER BY 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. Ниже несколько неполно, поскольку я не избегаю ценностей, но это в основном, где я застрял. Выяснение того, как динамически заполнять XML-файл на основе seqorder и определенных парней, не зная, сколько парнейдов может иметь идентификатор.

<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

Вам нужно разместить код, показывающий, как вы создаете текущий xml. Похоже, что он каким-то образом закодирован.Вы пытались использовать cfoutput group = ".."? Для этого потребуется несколько «групп», но если они структурированы правильно, вы можете использовать его для генерации неизвестного количества элементов PARNAMES. – Leigh

+0

Имея серьезные проблемы с nubtacular, отправляя код с форматированием stackoverflow. Даже с четырьмя пробелами с отступом, мой код отключается, когда я отправляюсь на почту. Есть идеи? – bman2013

+0

Глупый вопрос. Вы уверены, что это не просто обращение как текст? Это может привести к тому, что cfml исчезнет, ​​потому что браузер видит его как html-теги, поэтому он не отображается. Кроме того, вы попробовали кнопку кода, т.е. '{}'. – Leigh

ответ

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"> 
+0

Спасибо, Ли, я дам эту попытку сегодня и обновить результат. – bman2013

+0

С другой стороны, это не совсем трюк. См. Мой обновленный ответ. – Leigh

+0

Значение для # PARNAME # на самом деле не появляется, вместо этого значение boolean появляется «0». Как я могу получить фактическое значение для parname? – bman2013

Смежные вопросы