Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中重命名所有XML标记名_Java_Xml_Xml Parsing - Fatal编程技术网

在Java中重命名所有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> &

我有一个前缀如下的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>

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

您知道,您总是可以回到旧文本处理。只需搜索并替换正则表达式模式。 寻找

<([^:]*):(.*)>
并替换为开始标记

如果您必须用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());