XML в файл с разделителями табуляции - PullRequest
3 голосов
/ 01 февраля 2012

Я пытался получить XML в текстовый файл как файл, разделенный табуляцией, используя Coldfusion. Мне было интересно, может ли кто-нибудь помочь мне с этим подходом.

Мой XML может состоять из нескольких узлов с несколькими дочерними узлами. Я могу выработать логику поддержания количества вкладок для каждого дочернего узла и затем вернуть его в исходную точку.

Есть ли какой-то конкретный алгоритм рекурсии, о котором я не знаю?

XML такой:

<?xml version="1.0" encoding="UTF-8"?>
<I BMSMETA_AUTOMETASET_4_OPTIONS="Personnel"
id="b02bfa5f-f2d0-45ac-99e0-9e4e12416db1">
<I BMSMETA_AUTOMETASET_4_OPTIONS="Ranks"
    id="c25d4732-862b-4dc4-835e-eb167f63a114">
    <I BMSMETA_AUTOMETASET_4_OPTIONS="Army"
        id="7a54176d-38f9-4753-bb93-60649e70ddb1">
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Field Marshall (Fd Marshall) (FM)"
            id="5d311b9d-8d6e-4fa8-8933-a643bf55143d" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="General (Gen)"
            id="56d3aae4-7da9-4940-9692-e1ad90584127" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Lieutenant General (Lt Gen)"
            id="0f1bb73b-39ae-4920-9d23-2c92d543ef37" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Major General (Maj Gen)"
            id="9f269157-fde9-4ea4-ae1e-65344d56388e" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Brigadier (Brig)"
            id="33e15bd2-aa5e-4a99-8096-821568bf7156" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Colonel (Col )"
            id="fa38285d-2319-4e43-9207-3c4080497118" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Lieutenant Colonel (Lt Col) (CO)"
            id="9fab6b6a-c4b1-4b5d-a051-8c22260f3225" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Major (Maj) (OC)"
            id="9c232a00-1e54-427f-9fdf-73aa50f4c49e" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Captain (Capt) (SO3)"
            id="18043ea4-d9cd-41cd-9a5c-851de350b397" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Lieutenant (Lt)"
            id="9dfc1631-e49d-48e7-ad47-7ce41da36cdf" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Second Lieutenant (2nd Lieutenant) (2Lt)"
            id="4f423559-b2a6-4164-8718-b7fce8180331" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Subaltern"
            id="38f33ead-17d3-4358-8fc4-1e03ee46008a" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Cornet (Cnt)"
            id="59ed6193-4e6a-413f-92da-cb37508bc637" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Officer Cadet (Ocdt)"
            id="bfb6ab3a-13e5-46c0-82e7-0d63b794b4f6" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Junior Under Officer (JUO)"
            id="dfe840e8-421a-4017-9066-429e7b3778ed" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Senior Under officer (SUO)"
            id="52f083f3-0826-4b25-be68-3cefd8561e15" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Conductor (Cdtr)"
            id="3ed346d3-0248-40f7-bcfb-ba9b8dabe02f" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Non Commissioned Officer (NCO)"
            id="c0b0af29-f6c6-47f0-8a49-27514d78a55d" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Senior Non Commissioned Officer (SNCO)"
            id="aeaa3bcf-b104-4261-8a5b-652bdd4b8531" />
    </I>
</I>

и файл tsv, который я хочу, вот так вот -

Personnel
Ranks               
    Army            
        Field Marshall (Fd Marshall) (FM)       
        General (Gen)       
        Lieutenant General (Lt Gen)     
        Major General (Maj Gen)     
        Brigadier (Brig)        
        Colonel (Col )      
        Lieutenant Colonel (Lt Col) (CO)        
        Major (Maj) (OC)        
        Captain (Capt) (SO3)        
        Lieutenant (Lt)         
        Second Lieutenant (2nd Lieutenant) (2Lt)        
        Subaltern           
        Cornet (Cnt)        
        Officer Cadet (Ocdt)        
        Junior Under Officer (JUO)      
        Senior Under officer (SUO)      
        Conductor (Cdtr)        
        Non Commissioned Officer (NCO)      
            Senior Non Commissioned Officer (SNCO)  

1 Ответ

6 голосов
/ 01 февраля 2012

Лучше всего использовать XSLT:

<cfxml variable="myXML">
<?xml version="1.0" encoding="UTF-8"?>
<I BMSMETA_AUTOMETASET_4_OPTIONS="Personnel"
id="b02bfa5f-f2d0-45ac-99e0-9e4e12416db1">
<I BMSMETA_AUTOMETASET_4_OPTIONS="Ranks"
    id="c25d4732-862b-4dc4-835e-eb167f63a114">
    <I BMSMETA_AUTOMETASET_4_OPTIONS="Army"
        id="7a54176d-38f9-4753-bb93-60649e70ddb1">
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Field Marshall (Fd Marshall) (FM)"
            id="5d311b9d-8d6e-4fa8-8933-a643bf55143d" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="General (Gen)"
            id="56d3aae4-7da9-4940-9692-e1ad90584127" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Lieutenant General (Lt Gen)"
            id="0f1bb73b-39ae-4920-9d23-2c92d543ef37" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Major General (Maj Gen)"
            id="9f269157-fde9-4ea4-ae1e-65344d56388e" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Brigadier (Brig)"
            id="33e15bd2-aa5e-4a99-8096-821568bf7156" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Colonel (Col )"
            id="fa38285d-2319-4e43-9207-3c4080497118" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Lieutenant Colonel (Lt Col) (CO)"
            id="9fab6b6a-c4b1-4b5d-a051-8c22260f3225" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Major (Maj) (OC)"
            id="9c232a00-1e54-427f-9fdf-73aa50f4c49e" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Captain (Capt) (SO3)"
            id="18043ea4-d9cd-41cd-9a5c-851de350b397" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Lieutenant (Lt)"
            id="9dfc1631-e49d-48e7-ad47-7ce41da36cdf" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Second Lieutenant (2nd Lieutenant) (2Lt)"
            id="4f423559-b2a6-4164-8718-b7fce8180331" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Subaltern"
            id="38f33ead-17d3-4358-8fc4-1e03ee46008a" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Cornet (Cnt)"
            id="59ed6193-4e6a-413f-92da-cb37508bc637" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Officer Cadet (Ocdt)"
            id="bfb6ab3a-13e5-46c0-82e7-0d63b794b4f6" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Junior Under Officer (JUO)"
            id="dfe840e8-421a-4017-9066-429e7b3778ed" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Senior Under officer (SUO)"
            id="52f083f3-0826-4b25-be68-3cefd8561e15" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Conductor (Cdtr)"
            id="3ed346d3-0248-40f7-bcfb-ba9b8dabe02f" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Non Commissioned Officer (NCO)"
            id="c0b0af29-f6c6-47f0-8a49-27514d78a55d" />
        <I BMSMETA_AUTOMETASET_4_OPTIONS="Senior Non Commissioned Officer (SNCO)"
            id="aeaa3bcf-b104-4261-8a5b-652bdd4b8531" />
    </I>
</I>
</I>
</cfxml>

Выше хранится ваш XML в объекте CF XML.Затем объект XSLT:

<cfxml variable="myXSLT">
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
    <xsl:call-template name="treeWalk">
      <xsl:with-param name="depth" select="0"/>
      <xsl:with-param name="node" select="I"/>
    </xsl:call-template>
</xsl:template>

<xsl:template name="treeWalk">
    <xsl:param name="depth"/>
    <xsl:param name="node" select="0"/>


    <xsl:call-template name="tabs">
      <xsl:with-param name="count" select="$depth"/>
    </xsl:call-template>

    <xsl:value-of select="$node/@BMSMETA_AUTOMETASET_4_OPTIONS" />  
<xsl:text>
</xsl:text>

    <xsl:if test="$node/I">
        <xsl:for-each select="$node/I">

            <xsl:call-template name="treeWalk">
              <xsl:with-param name="depth" select="$depth+1"/>
              <xsl:with-param name="node" select="."/>
            </xsl:call-template>

        </xsl:for-each>
    </xsl:if>   

</xsl:template>


<xsl:template name="tabs">
    <xsl:param name="count"/>

        <xsl:if test="$count > 0">
            <xsl:text>  </xsl:text>
            <xsl:call-template name="tabs">
              <xsl:with-param name="count" select="$count - 1"/>
            </xsl:call-template>
        </xsl:if>   
</xsl:template>


</xsl:stylesheet>
</cfxml>

Последнее, применение XLST к XML:

<code><cfset output = XMLTransform(myXML, myXSLT)>

<cfoutput>
<pre>
#output#
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...