我有一个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>
请帮忙。提前完成。
答案 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>
如果您想加快这个过程,有两种可能性:
要按升序为所有<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>
快,那么你必须自己衡量。