我有一个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");
}
是否可以使用更通用的方法?
您可以递归遍历和重命名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-$2>
替换起始标签。
如果你必须在java中这样做,那就有java.util.regex package。但sed rocks为此类任务。