2015-03-12 4 views
1

У меня есть XML-документ, и я хочу обновить сразу несколько узлов. В настоящее время я делаю вот так:Обновление нескольких узлов xml сразу в coldfusion?

<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> 

Пожалуйста, помогите. Thanx заранее.

+0

Вам необходимо выполнить петлю в соответствии с вашим первым примером. В чем проблема с этим? – andrewdixon

+0

Для получения дополнительных данных требуется много времени для обработки. – Beginner

ответ

2

Это добавит атрибут каждому узлу COLUMN. Но здесь сложность равна O (n).

Так можно сделать то же самое в O (1)?

No.

Вы хотите сделать что-то для каждого из 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. При добавлении идентификатора (что в принципе нет ничего, кроме счетчика) является то, что вы действительно делаете .. Подумайте, просто не делайте этого. Это похоже на довольно бесполезную операцию. Узлы XML имеют естественный порядок, им не нужен атрибут, который указывает их позицию.
  2. Используйте этот инструмент для обработки XML быстрее. XSLT could be worth a try, для комплексных преобразований в любом случае.

Чтобы дать всем <COLUMN> элементы идентификатор в порядке возрастания, вы могли бы использовать эту трансформацию:

<!-- 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> вам нужно будет измерить себя.

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