【问题标题】:Modify the text content of XML tag修改 XML 标签的文本内容
【发布时间】:2014-08-03 23:42:42
【问题描述】:

如何从标签的文本内容中为每个单词插入一个新标签?

如果我有这样的 xml:

<root>
  <el> Text content for tag 
 </el>
</root>

我希望输出是:

  <root>
   <el> <new>Text</new> <new>content</new> <new>for</new> <new>tag</new>
   </el>
  </root>

有什么想法吗?

【问题讨论】:

  • 从您的标签中,我认为您可以使用 Java 库来解析 XML 并在其中插入节点。查看此链接:stackoverflow.com/a/3248573/259889
  • 尝试使用split() + XML DOM 进行解析 + DOM 方法如createTextNode()appendChild() 等。搜索“How to parse XML in Java”
  • 您之前在一个更大的问题中问过这个问题。我根据该问题提供了一个答案(与此类似)。

标签: java xml


【解决方案1】:

您在此之前已经问过这个问题的一部分: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() 的方法,它返回一个新元素,其单词包含在&lt;w&gt; 元素中。该新元素用于替换旧元素。就是这个方法:

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

请注意,它递归地处理任何子元素,并用&lt;w&gt; 标记包装它在其中找到的任何单词。如果您想使用&lt;new&gt;,只需将"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);
}

【讨论】:

    猜你喜欢
    • 2018-07-05
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多