【问题标题】:Java+DOM: How do I elegantly rename an xmlns:xyz attribute?Java+DOM:如何优雅地重命名 xmlns:xyz 属性?
【发布时间】:2010-11-16 18:48:27
【问题描述】:

我有类似的输入:

<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”开头的属性名称。

【问题讨论】:

    标签: java xml dom namespaces


    【解决方案1】:

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

    如果您找到所需的节点 (getElementsByTagNameNS) 并将它们的qualifiedName (qname) 设置为包含您喜欢的前缀的新值,您可能会取得一些成功。然后重新生成 XML 文档。

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

    【讨论】:

    • 因为在某些特殊情况下我需要用户可读的 XML(通常是矛盾的)。谢谢你的回答!
    【解决方案2】:

    我已使用以下 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"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 2011-05-07
      • 2017-01-20
      • 1970-01-01
      • 2011-03-12
      相关资源
      最近更新 更多