【问题标题】:How to add a default name space with dom4j?如何使用 dom4j 添加默认名称空间?
【发布时间】:2021-03-11 12:05:00
【问题描述】:

我想使用 dom4j 为 XML 文档的根元素添加一个默认名称空间,如下面的 sn-p 所示。使用 dom4j 执行此操作的正确方法是什么?

<?xml version="1.0" encoding="utf-8" ?>
<animals xmlns="http://zoo.domain.org/schema/animals" >
    <animal id="1">
        <elephant>
            <name>Jumbo</name>
        </elephant>
    </animal>
</animals>

dom4j API 确实提供了 Element#addNamespace 方法,但 javadoc 告诉该前缀不能为空。 以下代码将生成 animals 的预期命名空间:

Document document = DocumentHelper.createDocument();
Element animals = document.addElement("animals")
        .addNamespace("", "http://zoo.domain.org/schema/animals");
Element animal = animals.addElement("animal")
        .addAttribute("id", "1");
animal.addElement("elephant")
        .addElement("name")
        .addText("Jumbo");

// write document to file etc.
...

...但是子元素animal 得到一个空字符串作为默认命名空间,这不是我想要的:

<?xml version="1.0" encoding="UTF-8"?>
<animals xmlns="http://zoo.domain.org/schema/animals">
    <animal xmlns="" id="1">
        <elephant>
            <name>Jumbo</name>
        </elephant>
    </animal>
</animals>

【问题讨论】:

    标签: java dom4j


    【解决方案1】:

    方法Document#addElement(也包括Element#addElement)接受第二个参数namespaceURI。这样就行了,将默认命名空间添加到 XML 元素。

    以下代码将生成预期的 XML。

    Document document = DocumentHelper.createDocument();
    Element animals = document.addElement("animals", "http://zoo.domain.org/schema/animals");
    Element animal = animals.addElement("animal")
            .addAttribute("id", "1");
    animal.addElement("elephant")
            .addElement("name")
            .addText("Jumbo");
    
    // write document to file etc.
    ...
    

    另外值得一提的是,如果您想自己创建一个元素,DocumentFactory#createElement 有一个重载版本,它也接受namespaceURIDocumentHelper#createElement 没有这样的重载方法。

    【讨论】:

    • 是的,就可以了。不错!
    【解决方案2】:

    您不是在创建文档(根)元素。

    Document document = DocumentHelper.createDocument();
    Element root = document.addElement( "animals" );
    // TODO the rest of your code
    

    最终,您会将文档传递给 XML 编写器以编写(保存)文档。另外,来自 Javadoc:

    元素addNamespace​(java.lang.String前缀java.lang.String uri) 向此元素添加名称空间以供其子内容使用 参数: prefix - 是要使用的前缀,不应为空或空白

    您可以尝试的一件事是创建Namespace 的实例,将空字符串传递给构造函数,然后改用Element.add() 方法。 Namespace的Javadoc并没有说明前缀不能为空。

    【讨论】:

    • 您对我的示例代码 sn-p 是正确的。 sn-p 不显示文档的创建。目的是只显示一个有助于预期 XML 的 sn-p。我不得不重新审视这个问题,以便更具体、更清楚地了解这一点。
    • @BartWeber 我的帖子的其余部分是正确的。您不能添加没有有效前缀的命名空间。但是,请尝试我创建 Namespace 对象并将其传递给空前缀的建议。那可能行得通。不过我不确定。
    • 真的!感谢您回答这个问题!不幸的是,它具有与提到的相同的不需要的结果:元素 animal 获取一个空字符串作为默认命名空间。
    • @BartWeber 你被 dom4j 困住了吗?如果没有,为什么不试试 JAXB?
    • 据我所知,JAXB 只能将 Java 类映射到 XML 表示(反之亦然)。我需要动态构建 XML 文件。
    猜你喜欢
    • 2012-10-22
    • 1970-01-01
    • 2011-07-18
    • 2016-11-25
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多