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

epfja78i  于 2023-02-11  发布在  Java
关注(0)|答案(8)|浏览(197)

我有一个文件,打印了一个默认的名称空间。打印的元素带有前缀ns 2,我需要删除这个,它是如何与我的代码:

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

我想怎么样:

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

这就是我如何编写它的,在我看来,它应该足以让ns 2消失:

<?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">
...

生成的package-info结果如下:

@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);

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;

是我错过了什么吗?还是我误解了它是如何工作的?

t5zmwmid

t5zmwmid1#

所有你需要做的就是当你打开一个新的包选择创建包信息在包信息中添加以下注解或根据需要更改它

@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前缀

5rgfhyps

5rgfhyps2#

响应中很可能有多个名称空间。这将使用默认约定创建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....

这将把http://namespace设置为默认的xmlns always,并且在编组时对所有其他名称空间使用ns#。如果需要,也可以给予它们更多描述性的前缀。

yhuiod9q

yhuiod9q3#

从JDK6u18开始,不再使用名称空间前缀Map器技术。

izkcnapc

izkcnapc4#

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

j2cgzkjk

j2cgzkjk5#

更改中elementFormDefault=“unqualified”的属性值

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:bar="http://namespace" targetNamespace="http://namespace" elementFormDefault="qualified">
q5lcpyga

q5lcpyga6#

对于Java 8:
我将前缀名称从“* ns 2 *”更改为“*fault *”。

首先,创建 * 默认名称空间前缀Map器 *。

import com.sun.xml.bind.marshaller.NamespacePrefixMapper;
import java.util.HashMap;
import java.util.Map;

public class DefaultNamespacePrefixMapper extends NamespacePrefixMapper {

    private static final String FAULT_PREFIX = "fault";

    private Map<String, String> namespaceMap = new HashMap<>();

    public DefaultNamespacePrefixMapper() {
        this.namespaceMap.put(NAMESPACE, FAULT_PREFIX);
    }

    @Override
    public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
        return namespaceMap.getOrDefault(namespaceUri, suggestion);
    }
}

其次,将 DefaultNamespacePrefixMapper 添加到封送处理程序属性。

@SuppressWarnings("unchecked")
private <T> void returnFault(T fault, SoapFault soapFault) {
    try {
        JAXBContext jaxbContext = JAXBContext.newInstance(fault.getClass());
        QName name = new QName(NAMESPACE, fault.getClass().getSimpleName());
        JAXBElement<T> element = new JAXBElement<>(name, (Class<T>) fault.getClass(), fault);

        Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new DefaultNamespacePrefixMapper());
        marshaller.marshal(element, soapFault.addFaultDetail().getResult());
    } catch (JAXBException e) {
        log.error("Exception when marshalling SOAP fault.", e);
    }
}

**第三,**在gradle/maven中添加以下依赖项。

compile 'com.sun.xml.bind:jaxb-impl:2.2.11'
compile 'com.sun.xml.bind:jaxb-core:2.2.11'
jvlzgdj9

jvlzgdj97#

从@XmlRootElement中删除命名空间
之前:XmlRootElement(name = "XXX", namespace = "abc.xsd")
之后:@XmlRootElement(name = "XXX")

enyaitl3

enyaitl38#

例如,如果要生成

<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

您需要在package-info.javaJAXB pojo类所在的同一个包中创建此类www.example.com类。

@XmlSchema(namespace = "http://www.w3.org/2001/XMLSchema-instance",
    elementFormDefault = XmlNsForm.QUALIFIED,
    xmlns = @XmlNs(prefix = "", namespaceURI = "urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"))
package com.amway.instantpayments.bankfileservice.jaxb.pojo;

import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

请注意,如果您将命名空间指定为“urn:iso:std:iso:20022:tech:xsd:pain.001.001.03“,并将命名空间URI指定为“http://www.w3.org/2001/XMLSchema-instance“,您将得到

ns2:Document xmlns:ns2="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

相关问题