Java使用replace复制xml节点和子节点

时间:2011-03-09 20:23:30

标签: java xml templates dom w3c

我有一个XML模板,其节点如(简化):

<items>
<sl:each value="iter" ignoreonzero="total">
  <item>
    <description><sl:prop value="desc" /></description>
    <total><sl:prop value="total" /></description>
  </item>
</sl:each>
</items>

我可以获取迭代器(ArrayList)并获取对象的值。我只是无法弄清楚如何将整个节点用作模板(<sl:each>包装器除外),保持它的子节点(和它们的子节点递归)完好无损。我需要用ArrayList中的对象替换<sl:prop />个节点,为每个项目重新放置。

样本所需的输出:

<items>
  <item>    
    <description>item 1</description>
    <total>1.23</description>
  </item>
  <item>    
    <description>item 2</description>
    <total>3.21</description>
  </item>
</items>  


我一直在努力:请帮忙吗?

import javax.xml.parsers.*;
import javax.xml.transform.*;
import org.w3c.dom.*;


NodeList eaches = itemsElement.getElementsByTagNameNS("sl","each");
for (int i=0;i<eaches.getLength();i++) 
{
  Node origNode = eaches.item(i);
  /*
    Code to get ArrayList and object
  */
  for (Object o : iter) {
    Node node = origNode.cloneNode(true);
    NodeList props = ((Element) node).getElementsByTagNameNS("sl","prop");
    for (int j=0;j<props.getLength();j++) {
      Node prop = props.item(j);
      String textContent = "";
      /*
        Code to get text content
      */
      Node parent = prop.getParentNode();
      Node text = doc.createTextNode(textContent);
      parent.replaceChild(prop,text);
    }
  }
}

1 个答案:

答案 0 :(得分:0)

调用Node node = origNode.cloneNode(true);后,您应该在insertAfter父节点上调用eaches。 迭代后不要忘记删除eaches节点!