在Java中重命名所有XML标记名
我有一个前缀如下的XML文件:在Java中重命名所有XML标记名,java,xml,xml-parsing,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> &
<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>
是否可以使用更通用的方法?您知道,您总是可以回到旧文本处理。只需搜索并替换正则表达式模式。 寻找
<([^:]*):(.*)>
并替换为开始标记
如果您必须用java来实现这一点,那么就有了。
但是对于这样的任务 您可以像这样递归地遍历和重命名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);
}
}
}
但是,如果你真的想打破的话,你应该考虑一下。好的,它仍然是一致的,但是您丢失了元素名称空间绑定。我不确定这是一个好主意,因为f:xxx意味着f是名称空间,标签xxx在adn XML解析器中定义,可能依赖冒号分隔符。为什么需要将冒号改为破折号?我正在使用APOC在Neo4j中导入xml,它完全忽略了带有逗号的名称空间。所以我需要用破折号来改变它。将xml作为文本来处理几乎总是一个坏主意idea@jtahlborn几乎总是这样。在这种情况下可能不是这样,假设OP只需要执行一次,并且我们可以合理地确保该模式不会出现在某个xml元素中。如何在不破坏字符编码的情况下将xml作为文本处理?请注意,xml是二进制格式,而不是文本格式
<([^:]*):(.*)>
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());