【问题标题】:Renaming all XML tag names in Java在 Java 中重命名所有 XML 标记名称
【发布时间】:2019-02-15 01:04:12
【问题描述】:

我有一个 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");
  }

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

【问题讨论】:

  • 我不确定这是一个好主意,因为f:xxx 意味着f 是标签xxx 在adn XML 解析器中定义的命名空间可能依赖于冒号分隔符。为什么要把冒号改成破折号?
  • 我在 Neo4j 中使用 APOC 导入 xml,它完全忽略了带逗号的命名空间。所以我需要用破折号来改变它。

标签: java xml xml-parsing


【解决方案1】:

您可以像这样递归地遍历和重命名 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。好的,它仍然是一致的,但你失去了元素命名空间绑定。

【讨论】:

    【解决方案2】:

    你知道,你总是可以回到痛苦的旧文本处理中。只需搜索和替换正则表达式模式。 搜索

    <([^:]*):(.*)>
    

    替换为&lt;$1-$2&gt;作为起始标签。

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

    【讨论】:

    • 将 xml 作为文本处理几乎总是一个坏主意
    • @jtahlborn 几乎总是这样。在这种情况下可能不是这样,假设 OP 只需要这样做一次,并且我们可以合理地确定该模式不会出现在某个 xml 元素中。实用主义。
    • 如何在不破坏字符编码的情况下将 xml 处理为文本? (注意xml是二进制格式,不是文本格式)
    猜你喜欢
    • 2016-07-15
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多