在coldfusion中一次更新多个xml节点?

时间:2015-03-12 11:37:43

标签: xml coldfusion xml-parsing

我有一个xml文档,我想一次更新多个节点。我目前正在这样做:

<cfset local.xml = xmlParse(filePath)>
<cfset local.column = xmlSearch(local.xml, "//COLUMN")>
<cfloop from="1" to="#arrayLen(local.column)#" index="i">
  <cfset local.xml.DATA.HEADER.COLUMN[i].xmlAttributes.ID = i>
</cfloop>

这将为每个COLUMN节点添加一个属性。但这里的复杂性是O(n)

所以可以在O(1)中做同样的事情吗?

我试过这样但是它只选择了第一个节点:

<cfset local.xml = xmlParse(filePath)>
<cfset local.xml.DATA.HEADER.COLUMN.xmlAttributes.ID = 1>

XML SAMPLE:

<?xml version="1.0" encoding="UTF-8"?>
<DATA>
  <HEADER>
    <COLUMN/>
    <COLUMN/>
    <COLUMN/>
    <COLUMN/>
    <COLUMN/>
    <COLUMN/>
  </HEADER>
</DATA>

请帮忙。提前完成。

1 个答案:

答案 0 :(得分:2)

  

这将为每个COLUMN节点添加一个属性。但这里的复杂性   是O(n)。

     

所以可以在O(1)中做同样的事情吗?

没有。

您希望为每个N个节点执行操作。无论你如何转动它,都是 O(n)

你可以让它看起来更好一点,但那就是它。

<cfset local.xml = XmlParse(filePath)>
<cfset local.columns = XmlSearch(local.xml, "//COLUMN")>

<cfloop array="#local.columns#" index="local.col">
  <cfset local.col.xmlAttributes.ID = i>
</cfloop>

如果您想加快这个过程,有两种可能性:

  1. 如果添加一个ID(基本上只是一个计数器)就是你真正做的......想想就是不这样做。它看起来像一个非常无用的操作。 XML节点具有自然顺序,他们不需要一个表明其位置的属性。
  2. 使用更快的XML处理工具来完成它。 XSLT could be worth a try,无论如何都要进行复杂的转换。
  3. 要按升序为所有<COLUMN>元素提供ID,您可以使用此转换:

    <!-- sample.xsl -->
    <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:output method="xml" indent="yes" />
    
        <xsl:template match="COLUMN">
            <xsl:copy>
                <xsl:attribute name="ID">
                    <xsl:value-of select="count(preceding-sibling::COLUMN) + 1" />
                </xsl:attribute>
                <xsl:apply-templates select="@*|node()" />
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()" />
            </xsl:copy>
        </xsl:template>
    </xsl:transform>
    

    和这个ColdFusion调用

    <cfset outputXml = XmlTransform(xmlFilePath, ExpandPath("sample.xsl"))>
    

    ...但如果它实际上比<cfloop>快,那么你必须自己衡量。