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

Veg*_*ard 21 java xml jaxb

我有一个使用默认命名空间打印的文件.这些元素使用前缀ns2打印,我需要将其删除,我的代码如何:

<ns2:foo xmlns:ns2="http://namespace" />
Run Code Online (Sandbox Code Playgroud)

我希望如何:

<foo xmlns="http://namespace" />
Run Code Online (Sandbox Code Playgroud)

这就是我编写它的方式,正如我所看到的那样,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">
...
Run Code Online (Sandbox Code Playgroud)

生成的package-info结果如下:

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

我创建这样的文件:

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);
Run Code Online (Sandbox Code Playgroud)

generatedClassesPackage是package-info.java和元素所在的包.

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

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

    @XmlElement(name = "Group", required = true)
    protected List<Group> group;
Run Code Online (Sandbox Code Playgroud)

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

小智 20

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

@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 = "") })
Run Code Online (Sandbox Code Playgroud)

这将删除ns2前缀

  • 如何使用 Maven 插件通过此更改生成包信息? (2认同)

Dan*_*ses 9

很可能您在响应中有多个名称空间.这将使用创建ns#namespace前缀的默认约定,其中一个成为没有前缀的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....
Run Code Online (Sandbox Code Playgroud)

这将http://namespace始终设置为默认xmlns,并在编组时使用ns#用于所有其他命名空间.如果需要,您还可以为其提供更多描述性前缀.

  • 应该注意的是,NamespacePrefixMapper现在是JDK中的内部类。因此,此解决方案不再有效... (2认同)

s33*_*890 6

从JDK6u18开始,不再使用NamespacePrefixMapper技术.

  • `NamespacePrefixMapper` 与 Java 11 和 `jaxb-runtime` 2.3.2 完美配合。 (2认同)

Die*_*aye 5

我解决了这个问题,将文件 package-info.java 删除到 jaxb classes 包中并重新编译应用程序。