【问题标题】:Dom4j xmlns attributeDom4j xmlns 属性
【发布时间】:2011-12-10 04:30:09
【问题描述】:

我只想将 xmlns 属性添加到根节点,但是当我向根元素添加命名空间时,所有后续子元素也会获得相同的 xmlns 属性。如何将 xmlns 属性添加到单个节点而不是其任何子节点? 代码:

public String toXml() {

        Document document = DocumentHelper.createDocument();
        Element documentRoot = document.addElement("ResponseMessage");
        documentRoot.addNamespace("",getXmlNamespace())
                .addAttribute("xmlns:xsi", getXmlNamespaceSchemaInstance())
                .addAttribute("xsi:schemaLocation", getXmlSchemaLocation())
                .addAttribute("id", super.getId());

        Element header = documentRoot.addElement("Header");
        buildHeader(header);

        Element body = documentRoot.addElement("Body");
        buildProperties(body);

        body.addElement("StatusMessage").addText(this.getStatusMessage().getMessage());

        return document.asXML();


    }

【问题讨论】:

  • 不清楚你的意思。当序列化为 XML 时,您是否在所有子元素上看到此命名空间声明?如何添加命名空间属性?你有一些代码和结果要展示吗?
  • 是的,当序列化为 xml 时,我在根元素的所有子元素上看到一个空 (xmlns="") ..

标签: java dom4j


【解决方案1】:

好的,新的答案。

如果您希望您的元素属于某个命名空间,请务必在该命名空间中创建它们。使用以Qname 作为其参数之一的方法。如果你创建一个没有命名空间的元素,DOM4J 将不得不添加命名空间声明以适应你的(不情愿的)规范。

您的示例稍作修改。我没有使用 QName,而是给每个元素一个命名空间 uri:

public static String toXml() {

    Document document = DocumentHelper.createDocument();
    Element documentRoot = document.addElement("ResponseMessage",
            getXmlNamespace());
    documentRoot.addAttribute(QName.get("schemaLocation", "xsi", "xsi-ns"),
            "schema.xsd").addAttribute("id", "4711");

    Element header = documentRoot.addElement("Header");

    Element body = documentRoot.addElement("Body", getXmlNamespace());
    // buildProperties(body);

    body.addElement("StatusMessage", getXmlNamespace()).addText("status");

    return document.asXML();

}

private static String getXmlNamespace() {
    return "xyzzy";
}

public static void main(String[] args) throws Exception {

    System.out.println(toXml());
}

作为输出产生:

<?xml version="1.0" encoding="UTF-8"?>
<ResponseMessage xmlns="xyzzy" xmlns:xsi="xsi-ns" xsi:schemaLocation="schema.xsd" id="4711">
<Header/><Body><StatusMessage>status</StatusMessage></Body>
</ResponseMessage>

更新 2:

还要注意,我更改了schemaLocation 属性的声明方式。您真的不必手动管理命名空间声明——这将由库处理。

但是,在一种情况下,添加命名空间声明可能很有用:如果您的文档主要包含命名空间 X 元素,并且一些具有命名空间 Y 的子元素散布在文档中,则声明 Y 的命名空间绑定在根元素处,可能会在子元素中节省大量重复的命名空间声明。

【讨论】:

  • 拥有相同的命名空间对象对我有用
【解决方案2】:

方法如下。它有点像黑客,但它可以满足您的需求:

public static String toXml() {

Document d = DocumentHelper.createDocument();
Namespace rootNs = new Namespace("", DEFAULT_NAMESPACE); // root namespace uri
Namespace xsiNs = new Namespace("xsi", XSI_NAMESPACE); // xsi namespace uri
QName rootQName = QName.get(rootElement, rootNs); // your root element's name

Element root = d.addElement(rootElement);
root.setQName(rootQName);
root.add(xsiNs);
root.addAttribute("xsi:schemaLocation", SCHEMA_LOC)
.addAttribute("id", super.getId());

Element header = documentRoot.addElement("Header");

Element body = documentRoot.addElement("Body", getXmlNamespace());
// buildProperties(body);

body.addElement("StatusMessage", getXmlNamespace()).addText("status");

return document.asXML();

}

【讨论】:

    猜你喜欢
    • 2013-07-08
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多