重命名Java中的所有XML标记名称

时间:2018-09-10 14:51:41

标签: java xml xml-parsing

我有一个带有这样的前缀的XML文件:

<h:table>
 <h:tr>
 <h:td>Apples</h:td>
 <h:td>Bananas</h:td>
 </h:tr>
</h:table>

<f:table>
 <f:name>African Coffee Table</f:name>
 <f:width>80</f:width>
 <f:length>120</f:length>
</f:table>

我想重命名以冒号代替冒号的前缀,所以:

<h-table>
 <h-tr>
 <h-td>Apples</h:td>
 <h-td>Bananas</h:td>
 </h-tr>
</h-table>

<f-table>
 <f-name>African Coffee Table</f:name>
 <f-width>80</f:width>
 <f-length>120</f:length>
</f-table>

我知道使用DOM解析器可以按名称获取元素,但是在我的情况下,由于模式始终相同,因此我需要全部应用重命名。

现在我必须无数次编写此函数,因为一个仅用于一个标签:

  NodeList nodes = document.getElementsByTagName("h:table");
   for (Node eachNode: nodes) {
  document.renameNode(eachNode, null, "h-table");
  }

是否可以使用更通用的方法?

2 个答案:

答案 0 :(得分:2)

您可以像这样递归遍历和重命名DOM元素:

private static void renameElement(Document document, Element element) {
    document.renameNode(element, null, element.getNodeName().replace(':', '-'));
    NodeList children = element.getChildNodes();
    for(int i = 0; i < children.getLength(); i++) {
        Node child = children.item(i);
        if (child instanceof Element) {
            renameElement(document, (Element) child);
        }

    }
}

从根元素开始递归:

renameElement(document, document.getDocumentElement());

但是,您应该考虑是否真的想破坏XML namespace-well-formed conformance。好的,它仍然是一致的,但是您丢失了元素名称空间绑定。

答案 1 :(得分:1)

您总是可以退回旧文本处理的痛苦。只需搜索并替换正则表达式模式即可。 搜索

c

,并用<([^:]*):(.*)> 代替开始标记。

如果必须在Java中执行此操作,则有java.util.regex package。 但是sed rocks用于此类任务。