代码之家  ›  专栏  ›  技术社区  ›  ivan_ivanovich_ivanoff

Java+DOM:我如何优雅地重命名XMLNS:XYZ属性?

  •  0
  • ivan_ivanovich_ivanoff  · 技术社区  · 16 年前

    我有类似的东西作为输入:

    <root xmlns="urn:my:main" 
        xmlns:a="urn:my:a" xmlns:b="urn:my:b">
    
        ...
    </root>
    

    想要有这样的输出:

    <MY_main:root xmlns:MY_main="urn:my:main" 
        xmlns:MY_a="urn:my:a" xmlns:MY_b="urn:my:b">
    
        ...
    </MY_main:root>
    

    …或者反过来。

    如何以优雅的方式使用DOM来实现这一点?
    也就是说,不搜索以“xmlns”开头的属性名。

    2 回复  |  直到 10 年前
        1
  •  1
  •   Gerco Dries    16 年前

    在DOM中找不到xmlns属性,它们不是DOM的一部分。

    如果找到所需的节点(getElementsByTagnamens),并将其限定名(qName)设置为包含所需前缀的新值,则可能会获得一些成功。然后重新生成XML文档。

    顺便说一下,在使用任何健全的XML解析器时,名称空间前缀(这正是您试图更改的内容)在很大程度上是不相关的。命名空间URI才是最重要的。为什么要将前缀设置为特定值?

        2
  •  0
  •   Michael Rutherfurd    16 年前

    我已使用以下JDOM存根删除所有命名空间引用:

    Element rootElement = new SAXBuilder().build(contents).getRootElement();
    
    for (Iterator i = rootElement.getDescendants(new ElementFilter()); i.hasNext();) {
        Element el = (Element) i.next();
        if (el.getNamespace() != null) el.setNamespace(null);
    }
    
    return rootElement;
    

    读取和写入XML是正常的。如果您只是在人类可读输出之后,那么应该执行该任务。但是,如果您需要转换回,您可能会遇到问题。

    根据您的示例(未测试),下面的内容可能可以用更友好的版本替换命名空间:

    rootElement.setNamespace(Namespace.getNamespace("MY_Main", "urn:my:main"));
    rootElement.addNamespaceDeclaration(Namespace.getNamespace("MY_a", "urn:my:a"))
    rootElement.addNamespaceDeclaration(Namespace.getNamespace("MY_b", "urn:my:b"))