2011-11-22 29 views
1

我下面的關閉:如何添加在關閉由StreamingMarkupBuilder使用的節點

def myData = { 
    mkp.xmlDeclaration() 
    OneEntry() { 
     SecondInnerEntry() 
    } 
} 

我可以序列化的XML表示與StreamingMarkupBuilder(進口略):

System.out << XmlUtil.serialize(new StreamingMarkupBuilder().bind(myData)) 

這給me:

<?xml version="1.0" encoding="UTF-8"?> 
<OneEntry> 
    <SecondInnerEntry/> 
</OneEntry> 

但是現在我想在調用之前添加一個新條目的方法來獲得:

<?xml version="1.0" encoding="UTF-8"?> 
<OneEntry> 
    <FirstInnerEntry/> 
    <SecondInnerEntry/> 
</OneEntry> 

我怎樣才能做到這一點(即操縱關閉插入一個新的節點,我不想重新整myData只插入一個元素)?

回答

2

在不改變myData(如erimerturk說),或執行兩遍,即:

  1. 產生具有myData
  2. 的XML解析該XML與XmlParser
  3. 在所需位置
  4. 插入一個節點
  5. 寫這個新的xml出

我不認爲這是可能的。該問題可以歸結爲:

我怎樣才能插入語句在現有的封閉中間

爲了這簡單的答案是「你可以用」 T「*

(*有可能做什麼,你是通過AST變換方法很努力,但給我的感覺它可能不會在這種情況下是可能的)

+0

感謝您的回答。我找到了解決方案,但沒有找到理想的答案。你的回覆對於Groovy的限制是相當有趣的,我需要在Groovy中進行更深入的研究...... – Kartoch

0

以下解決方案正在爲我的具體情況,但沒有完全回答e問題(散步並修改關閉)

import groovy.xml.StreamingMarkupBuilder 
import groovy.xml.XmlUtil 

def dataToInsert = { 
    FirstInnerEntry() 
} 

def myData = { 
    mkp.xmlDeclaration() 
    OneEntry() { 
     mkp.yield dataToInsert 
     SecondInnerEntry() 
    } 
} 

System.out << XmlUtil.serialize(new StreamingMarkupBuilder().bind(myData)) 
相關問題