删除 ns2 作为默认命名空间前缀

2022-09-01 05:15:17

我有一个使用默认命名空间打印的文件。这些元素以 ns2 的前缀打印,我需要删除它,我的代码也是如此:

<ns2:foo xmlns:ns2="http://namespace" />

我想要它是什么样子:

<foo xmlns="http://namespace" />

这就是我对它进行编码的方式,在我看来,它应该足以让ns2消失:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:bar="http://namespace" targetNamespace="http://namespace"
    elementFormDefault="qualified">
...

生成的包信息如下所示:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://namespace", 
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.foo.bar;

我创建的文件是这样的:

JAXBContext jaxbContext = JAXBContext.newInstance(generatedClassesPackage);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(new JAXBElement<Foo>(new QName("http://namespace", "Foo"),
Foo.class, rootFoo), outputStream);

生成的ClassesPackage是包信息.java和元素所在的包。

Foo 对象已定义,并具有如下元素:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "group"
})
@XmlRootElement(name = "Foo")
public class Foo {

    @XmlElement(name = "Group", required = true)
    protected List<Group> group;

这是我错过的东西吗?还是我误解了这是如何工作的?


答案 1

您需要做的就是在打开新包时选择在包信息中创建包信息添加以下注释或根据需要更改它

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.sitemaps.org/schemas/sitemap/0.9", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED, xmlns = { @javax.xml.bind.annotation.XmlNs(namespaceURI = "http://www.sitemaps.org/schemas/sitemap/0.9", prefix = "") })

这将删除 ns2 前缀


答案 2

响应中很可能有多个命名空间。这将使用创建 ns# 命名空间前缀的默认约定,其中一个命名空间将成为没有前缀的 xmlns。如果要控制这一点,可以执行以下操作:

NamespacePrefixMapper mapper = new NamespacePrefixMapper() {
        public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
            if ("http://namespace".equals(namespaceUri) && !requirePrefix)
                return "";
            return "ns";
        }
    };
    marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", mapper);
    marshaller.mashal....

这会将 始终设置为默认 xmlns,并在封送处理时对所有其他命名空间使用 ns#。如果需要,您还可以为它们提供更具描述性的前缀。http://namespace


推荐