JAXB:为啥在生成的 xml 文档中未使用定义的命名空间前缀?

     2023-02-22     14

关键词:

【中文标题】JAXB:为啥在生成的 xml 文档中未使用定义的命名空间前缀?【英文标题】:JAXB: why are defined namespace prefixes not used in generated xml document?JAXB:为什么在生成的 xml 文档中未使用定义的命名空间前缀? 【发布时间】:2021-04-03 09:12:33 【问题描述】:

您好,我使用 xic 编译器从 xml 模式文件 (mets.xsd) java 类生成。此 xsd 文件使用一些其他名称空间(premis.xsd、ead.xsd ...)。为了使用命名空间前缀,我在 package-info.java 文件中添加了一些注释,如下所示:

@XmlSchema(
    elementFormDefault=XmlNsForm.QUALIFIED,
    location="http://www.loc.gov/mets/mets.xsd",
    namespace="http://www.loc.gov/METS/",
    xmlns=
    
            @XmlNs(prefix="METS",   namespaceURI="http://www.loc.gov/mets/"),
            @XmlNs(prefix="EAD",    namespaceURI="http://www.loc.gov/ead/"),
            @XmlNs(prefix="PREMIS", namespaceURI="http://www.loc.gov/premis/v2/"),
            @XmlNs(prefix="xlink",  namespaceURI="http://www.w3.org/1999/xlink"),
            @XmlNs(prefix="OAI_DC", namespaceURI="http://www.openarchives.org/OAI/2.0/oai_dc/"),
            @XmlNs(prefix="DC",     namespaceURI="http://purl.org/dc/elements/1.1/")
    
)
package ch.eugster.herakles.sip.matterhorn.mets;

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

当我将 java 对象编组为 xml 时,我得到以下输出:

<?xml version="1.0" encoding="UTF-8"?>
<ns1:mets xmlns:METS="http://www.loc.gov/mets/" xmlns:EAD="http://www.loc.gov/ead/" xmlns:PREMIS="http://www.loc.gov/premis/v2/" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:OAI_DC="http://www.openarchives.org/OAI/2.0/oai_dc/" xmlns:DC="http://purl.org/dc/elements/1.1/" xmlns:ns1="http://www.loc.gov/METS/" PROFILE="http://www.docuteam.ch/xmlns/sip-profile.xml">
   <ns1:amdSec/>
   <ns1:fileSec>
      <ns1:fileGrp/>
   </ns1:fileSec>
   <ns1:structMap>
      <ns1:div TYPE="rootfolder" ORDER="1" LABEL="RootFolder_Temp"/>
   </ns1:structMap>
</ns1:mets>

如您所见,前缀定义正确,但未在文档中使用。有谁知道,这可能是什么原因?非常感谢!

【问题讨论】:

嗨,即使我实际上也面临同样的问题。在创建QName 期间不使用提供的prefix。它总是使用默认的命名空间前缀,例如ns0,ns1, etc。我也在使用Moxy。你找到这个问题的答案了吗? 【参考方案1】:

即使我也面临同样的问题(即使在将custom prefix 提供给我的QName 之后,我也得到了默认的命名空间前缀,例如ns0,ns1,etc)所以我尝试了很多东西,终于能够得到它所以在这里发布相同的内容,以便对您以及将来的其他人有所帮助。你可以找到my question here

    删除package-info.java 及其所有内容(如果您在尝试某些内容时添加了)。

    由于您使用的是Moxy,因此您可以使用所有必需的NamespcaeURI and Prefix 创建一个Map。像这样的:

Map<String, String> urisToPrefixes = new HashMap<String, String>();
urisToPrefixes.put("http://www.loc.gov/mets/", "METS");
urisToPrefixes.put("http://www.loc.gov/ead/", "EAD"); 
urisToPrefixes.put("http://www.loc.gov/premis/v2/", "PREMIS"); 
    使用Marshalling 方法时,添加property 并将此Map 作为参数发送:
    marshaller.setProperty(MarshallerProperties.NAMESPACE_PREFIX_MAPPER, urisToPrefixes);

这将确保无论何时遇到Namespace,它都会检查相应的prefix并将其添加到XML header,因此它将所有默认前缀ns0,ns1 etc替换为对应的prefix从地图上看。

完整的示例代码:

JAXBContext ctx = JAXBContext.newInstance(new Class[]  TestObject.class, SubObject.class );
Map<String, String> urisToPrefixes = new HashMap<String, String>();
urisToPrefixes.put("http://www.loc.gov/mets/", "METS");
urisToPrefixes.put("http://www.loc.gov/ead/", "EAD"); urisToPrefixes.put("http://www.loc.gov/premis/v2/", "PREMIS");
Marshaller m = ctx.createMarshaller();
m.setProperty(MarshallerProperties.NAMESPACE_PREFIX_MAPPER, prefixesToUris);

如果您想了解更多关于此和其他方法的信息,请查找documentation here:

【讨论】:

如何在ij中使用jaxb2通过xml定义生成对应的javaentity类的文件

...单上选择“GenerateXSDschemafromXMLFile...”,按默认设置生成xsd文件。将xsd文件移至#1配置段的configuration/sources/source指定的路径下.#1.打开pom.xml,加入下面的配置段.其中configuration节点中的内容依具体 查看详情

jaxb使用方式

...Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。现在在软件开发中,主要也就是使用它XML与JAVA类互相转换的功能了一些常用的属性解释:Marshaller接口... 查看详情

使用 JAXB 将 XML 文档嵌入到另一个 XML 中

...时间】:2012-08-1415:08:14【问题描述】:JAXB对象是用Eclipse生成的,然后我一直在尝试对其进行调整。我想用JAXB得到这个:</RootElementxmlns="http://example.com/rootElement"><Body&g 查看详情

java生成解析xml的另外两种方法jaxb

...Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用... 查看详情

java生成解析xml的另外两种方法jaxb

...Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用... 查看详情

xml问题为啥有些xml文档有xs:而有些没有

xml中xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"和schemaxmlns="http://www.w3.org/2001/XMLSchema"有什么区别<elementname="书籍列表"></element>和<xs:elementname="书籍列表"></xs:element>有什么区别首先... 查看详情

如何仅从 XML 生成 JAXB 类

】如何仅从XML生成JAXB类【英文标题】:HowtogenerateJAXBclassesfromjustXML【发布时间】:2011-06-2702:21:24【问题描述】:我需要从不提供架构的xml生成类。我知道这几乎没用,但事实是我们有xml,它是结构化的,我们应该能够从xml创建模... 查看详情

使用 JAXB 解组多次出现的 XML 元素

...布时间】:2021-10-1817:02:38【问题描述】:我正在尝试将XML文档解组到我的模型中。问题是我有一个XML元素&lt;additional_detail&gt;在XML文档中多次出现。当我解组XML文档时,JSON元素的值是最后一次出现的&lt 查看详情

使用带有签名、加密和编码的 JAXB

...制定XML通信规范。我的一些同事对JAXB用于编组和解组XML文档有很高的评价。我花了一些时间玩弄它,我明白它们来自哪里。它让简单的XML文档变得简单。现在把它提升一个档次。我希望在我们的通信模型中为在我之 查看详情

没有由 JAXB 生成的 @XmlRootElement

】没有由JAXB生成的@XmlRootElement【英文标题】:No@XmlRootElementgeneratedbyJAXB【发布时间】:2010-10-2314:43:00【问题描述】:我正在尝试从FpML(金融产品标记语言)4.5版生成Java类。生成了大量代码,但我无法使用它。试图序列化一个简... 查看详情

为啥我的变量在 useEffect 中定义的其他地方在反应中未定义?

】为啥我的变量在useEffect中定义的其他地方在反应中未定义?【英文标题】:WhyismyvariabledefinedinuseEffectelsewhereundefinedinreact?为什么我的变量在useEffect中定义的其他地方在反应中未定义?【发布时间】:2021-09-3003:38:59【问题描述】... 查看详情

验证 List(Jaxb) 中未编组的条目

】验证List(Jaxb)中未编组的条目【英文标题】:VerifyingunmarshalledentriesfromList(Jaxb)【发布时间】:2021-11-0506:28:57【问题描述】:我有4个XML文件,其结构如下:<?xmlversion="1.0"?><Registry><Insitutions><Insitiution><name>A<... 查看详情

JAXB:如何在解组 XML 文档期间忽略命名空间?

】JAXB:如何在解组XML文档期间忽略命名空间?【英文标题】:JAXB:HowtoignorenamespaceduringunmarshallingXMLdocument?【发布时间】:2010-09-2114:34:28【问题描述】:我的架构指定了一个命名空间,但文档没有。在JAXB解组(XML->对象)期间忽... 查看详情

jaxb对xml报文头的小修小改

...有趣好玩的东西,权当记录下来.  本文主要讲解jaxb如何生成约定的xml报文头的实现思路,点比较小,而且方法有点trick,因此导致取博文标题的时候,也有些小迷茫,^_^. 现象:  我们先来定义一个简单的java类,并用于生成其对应... 查看详情

为啥响应在服务中可用但在组件中未定义? [复制]

】为啥响应在服务中可用但在组件中未定义?[复制]【英文标题】:Whyistheresponseavailableinaservicebutinthecomponentisundefined?[duplicate]为什么响应在服务中可用但在组件中未定义?[复制]【发布时间】:2018-04-0713:17:11【问题描述】:我有... 查看详情

为啥 this.$refs 在 Vue 子组件中未定义?

】为啥this.$refs在Vue子组件中未定义?【英文标题】:Whyisthis.$refsundefinedinVuechildcomponent?为什么this.$refs在Vue子组件中未定义?【发布时间】:2020-07-1813:36:39【问题描述】:我正在Vue中处理拖放组件,但是当我尝试使用this.$refs访问... 查看详情

jpa的xml生成(jaxb)和数据库视图

我必须使用JPA-jaxb生成XML。它使用普通表映射完成,但现在我有一个用于JPA生成的数据库视图(11个表关系)。如何为视图中的所有表创建实体类?。那可能吗?答案当您使用Eclipse时,我建议使用JBossTools。JBossTools提供Hibernate逆... 查看详情

为啥使用自定义全局验证器在角度材料 6 的 mat-form 字段中未显示 mat-error

】为啥使用自定义全局验证器在角度材料6的mat-form字段中未显示mat-error【英文标题】:Whymat-errornotgetdisplayedinsidemat-formfieldinangularmaterial6withcustomglobalvalidators为什么使用自定义全局验证器在角度材料6的mat-form字段中未显示mat-error【... 查看详情