【问题标题】:Java duplicating xml node and child nodes with replaceJava用replace复制xml节点和子节点
【发布时间】:2011-07-12 05:21:28
【问题描述】:

我有一个带有节点的 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)并获取对象的值。我只是不知道如何将整个节点用作模板(&lt;sl:each&gt; 包装器除外),保持它的子节点(及其子节点递归)完好无损。我需要用 ArrayList 中对象的值替换 &lt;sl:prop /&gt; 节点,并为每个项目重复。

样本期望输出:

<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);
    }
  }
}

【问题讨论】:

    标签: java xml templates dom w3c


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-08
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多