您在此之前已经问过这个问题的一部分:Add new node in XML file
基于此,我将使用与您在 that 问题中使用的示例类似的示例,它比这个更复杂一些,因为元素不包含纯文本,但可以具有混合内容(元素和文本)。
我在那里使用的 XML 是你之前发布的那个:
<nodes>
<RegDef>This <i>text</i> have i node.</RegDef>
<RegDef>This text doesn't have i atribute.</RegDef>
</nodes>
请参阅 previous question。在那个问题中,我调用了一个我称为wrapWordsInContents() 的方法,它返回一个新元素,其单词包含在<w> 元素中。该新元素用于替换旧元素。就是这个方法:
public static Element wrapWordsInContents(Element node, Document document) {
NodeList children = node.getChildNodes();
int size = children.getLength();
Element newElement = document.createElement(node.getTagName());
for(int i = 0; i < size; i++) {
if (children.item(i).getNodeType() == Document.ELEMENT_NODE) {
newElement.appendChild(wrapWordsInContents((Element)(children.item(i)), document));
} else { // text node
String text = children.item(i).getTextContent().trim();
if(text.isEmpty()) {
continue;
}
String[] words = text.split("\\s");
for(String word : words) {
Element w = document.createElement("w");
Node textNode = document.createTextNode(word);
w.appendChild(textNode);
newElement.appendChild(w);
}
}
}
return newElement;
}
请注意,它递归地处理任何子元素,并用<w> 标记包装它在其中找到的任何单词。如果您想使用<new>,只需将"w" 替换为"new"。
如果您使用此方法运行上一个问题中的代码,您将获得一个新文档,该文档将生成一个 XML,当序列化时将产生此输出:
<nodes>
<RegDef><w>This</w><i><w>text</w></i><w>have</w><w>i</w><w>node.</w></RegDef>
<RegDef><w>This</w><w>text</w><w>doesn't</w><w>have</w><w>i</w><w>atribute.</w></RegDef>
</nodes>
对于您在此问题中发布的代码示例,您将使用:
NodeList elNodes = document.getElementsByTagName("el");
int size = elNodes.getLength();
for(int i = 0; i < size; i++) {
Element el = (Element)elNodes.item(i);
Element newEl = wrapWordsInContents(el, document);
Element parent = (Element)el.getParentNode(); // this is `<root>`
parent.replaceChild(newEl, el);
}