【问题标题】:Namespace with no prefix in JAXBJAXB 中没有前缀的命名空间
【发布时间】:2017-05-01 14:56:42
【问题描述】:

我正在尝试使用 JAXB 创建一个 Sitemap index 文件。按照创建站点地图的要求,我必须在根元素中添加命名空间属性:

<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

我想要一个简单的方法来解决这个问题。由于这似乎是一个标准程序,我不想对我的项目执行complex workaround or add more dependencies 来解决这个问题

当前输出如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:sitemapindex xmlns:ns2="http://www.sitemaps.org/schemas/sitemap/0.9">
    <sitemap>
        <loc>https://www.example.com/sitemap-1.xml</loc>
        <lastmod>2017-05-01T15:41:17.561+01:00</lastmod>
    </sitemap>
</ns2:sitemapindex>

我的SitemapIndex 型号如下:

@XmlRootElement(name = "sitemapindex", namespace="http://www.sitemaps.org/schemas/sitemap/0.9")
@XmlAccessorType(XmlAccessType.FIELD)
public class SitemapIndex {

    @XmlElement(name = "sitemap")
    private List<Sitemap> sitemaps;

    public void setSitemaps(List<Sitemap> sitemaps) {
        this.sitemaps = sitemaps;
    }

    public List<Sitemap> getSitemaps() {
        return sitemaps;
    }
}

我也尝试手动添加命名空间字段,它适用于生成文件,但是当我尝试读取文件时抛出异常。

@XmlAttribute(name="xmlns")
private final String namespace ="http://www.sitemaps.org/schemas/sitemap/0.9";

【问题讨论】:

    标签: java jaxb xml-namespaces


    【解决方案1】:

    您可以使用@XmlSchmea [1] 包级别注释来设置前缀。在您的情况下,我们只是设置了空前缀。

    只需在您的包中创建 package-info.java 文件,例如com.stackoverflow.jaxb,内容类似。

    package-info.java

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

    注意,您可以从 @XmlRootElement 注释中删除 namespace 属性。


    [1]https://jaxb.java.net/nonav/2.2.4/docs/api/javax/xml/bind/annotation/XmlSchema.html

    【讨论】:

    • 感谢您的建议。该解决方案使我可以为具有不同架构的每个模型提供不同的包。无论如何,我认为这是最适合我的问题的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    相关资源
    最近更新 更多