jaxb 命名空间

对于某些XML模式来说,它是一组严格的规则,用于规定XML文档的结构方式。 但是对于其他人来说,通常的准则是指出XML的外观。 这意味着有时出于某些原因,人们希望接受不符合XML模式的输入。 在此示例中,我将演示如何利用SAX XMLFilter来完成此操作。

Java模型

下面是将用于此示例的Java模型。

顾客

package blog.namespace.sax;import javax.xml.bind.annotation.XmlRootElement;@XmlRootElement
public class Customer {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}

包装信息

我们将使用包级别@XmlSchema批注为模型指定名称空间限定。

@XmlSchema(namespace='http://www.example.com/customer',elementFormDefault=XmlNsForm.QUALIFIED)
package blog.namespace.sax;import javax.xml.bind.annotation.*;

XML输入(input.xml)

即使我们的元数据指定所有元素都应使用命名空间(http://www.example.com/customer)限定,我们的输入文档也不是使用命名空间限定的。 在解组操作期间,将使用XMLFilter添加名称空间。

<?xml version='1.0' encoding='UTF-8'?>
<customer><name>Jane Doe</name>
</customer>

XMLFilter(NamespaceFilter)

创建XMLFilter的最简单方法是扩展XMLFilterImpl 。 对于我们的用例,我们将覆盖startElementendElement方法。 在这些方法的每一个中,我们将调用相应的super方法,并将默认名称空间作为URI参数传递。

package blog.namespace.sax;import org.xml.sax.*;
import org.xml.sax.helpers.XMLFilterImpl;public class NamespaceFilter extends XMLFilterImpl {private static final String NAMESPACE = 'http://www.example.com/customer';@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {super.endElement(NAMESPACE, localName, qName);}@Overridepublic void startElement(String uri, String localName, String qName,Attributes atts) throws SAXException {super.startElement(NAMESPACE, localName, qName, atts);}}

演示版

在下面的演示代码中,我们将对XML文档进行SAX解析。 XMLReader将包装在我们的XMLFilter中 。 我们将利用JAXB的UnmarshallerHandler作为ContentHandler 。 解析完成后,我们可以向UnmarshallerHandler请求生成的Customer对象。

package blog.namespace.sax;import javax.xml.bind.*;
import javax.xml.parsers.*;
import org.xml.sax.*;public class Demo {public static void main(String[] args) throws Exception {// Create the JAXBContextJAXBContext jc = JAXBContext.newInstance(Customer.class);// Create the XMLFilterXMLFilter filter = new NamespaceFilter();// Set the parent XMLReader on the XMLFilterSAXParserFactory spf = SAXParserFactory.newInstance();SAXParser sp = spf.newSAXParser();XMLReader xr = sp.getXMLReader();filter.setParent(xr);// Set UnmarshallerHandler as ContentHandler on XMLFilterUnmarshaller unmarshaller = jc.createUnmarshaller();UnmarshallerHandler unmarshallerHandler = unmarshaller.getUnmarshallerHandler();filter.setContentHandler(unmarshallerHandler);// Parse the XMLInputSource xml = new InputSource('src/blog/namespace/sax/input.xml');filter.parse(xml);Customer customer = (Customer) unmarshallerHandler.getResult();// Marshal the Customer object back to XMLMarshaller marshaller = jc.createMarshaller();marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);marshaller.marshal(customer, System.out);}}

输出量

以下是运行演示代码的输出。 注意输出如何包含基于元数据的名称空间限定。

<?xml version='1.0' encoding='UTF-8'?>
<customer xmlns='http://www.example.com/customer'><name>Jane Doe</name>
</customer>

进一步阅读

如果您喜欢这篇文章,那么您可能也会对以下内容感兴趣:

  • JAXB和命名空间
  • 防止JAXB中的实体扩展攻击

参考:在Java XML和JSON绑定博客中,我们的JCG合作伙伴 Blaise Doughan 在JAXB Unmarshal期间应用名称空间 。

翻译自: https://www.javacodegeeks.com/2012/11/applying-a-namespace-during-jaxb-unmarshal.html

jaxb 命名空间

jaxb 命名空间_在JAXB解组期间应用名称空间相关推荐

  1. 在JAXB解组期间应用名称空间

    对于某些XML模式来说,它是一组严格的规则,用于规定XML文档的结构方式. 但是对于其他人来说,通常的准则是指出XML的外观. 这意味着有时出于某些原因人们希望接受不符合XML模式的输入. 在此示例中 ...

  2. spring配置详解-属性注入(p名称空间SPEL表达式)

    所谓了解的话讲了一般是不会用的,看一下了解的注入方式,还有一种叫p名称空间注入方式,是Spring最近发出来的,因为Bean注入方式已经深入人心了,所以后面这两种注入方式,哪怕是好,也不愿意去用,因为 ...

  3. python定义变量名的时候、需要注意问题_第39p,Python模块的名称空间问题,应该讲完了吧...

    大家好,我是杨数Tos,这是<从零基础到大神>系列课程的第39篇文章,第二阶段的课程:Python基础知识:Python中模块与包的概念与使用(下篇). 学习本课程,建议先看一遍:[计算机 ...

  4. stax 和jaxb 关系_XML解组基准:JAXB,STAx,Woodstox

    stax 和jaxb 关系 介绍 上周末,我开始考虑如何以一种资源友好的方式处理大量XML数据.我要解决的主要问题是如何以块的形式处理大型XML文件,同时提供上游/下游系统,需要处理一些数据. 当然, ...

  5. XML解组基准:JAXB,STAx,Woodstox

    介绍 上周末,我开始考虑如何以一种资源友好的方式处理大量XML数据.我要解决的主要问题是如何以块的形式处理大型XML文件,同时提供上游/下游系统,需要处理一些数据. 当然,我已经使用JAXB技术已有几 ...

  6. java jaxb 集合_java-使用JAXB解组/编组List String

    java-使用JAXB解组/编组List 我正在尝试创建一个非常简单的REST服务器. 我只是有一个测试方法,它将返回字符串列表. 这是代码: 它给出以下错误: SEVERE: A message b ...

  7. java如何添加同名的xml节点_java – 解组具有多个同名元素的XML JAXB

    我正在尝试解组具有多个具有相同名称的元素的XML文档.我不确定是否需要创建我的bean的Arraylist并将其传递给unmarshaller.我希望有人能给我一些指导来解决这个问题.我试图解析的XM ...

  8. java xsi type_java – JAXB:如何在解组时读取xsi:type值

    JAXB (JSR-222)实施将为您处理一切. JAXB认为每个类对应一个复杂类型.它有一个算法来确定类型名称,但您可以使用@XmlType注释覆盖它.如果元素是包含xsi:type属性的解组,则J ...

  9. xml java jaxb_【Java】JAXB操作XML用法详解

    什么是JAXB? JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.在JAX-WS(Java的W ...

最新文章

  1. ehcache 简介
  2. 支持手机版网站的We7CMS
  3. python使用教程cmd啥意思-python中执行cmd的方式
  4. 中国新十大军工企业名单及简称
  5. kmalloc、vmalloc、malloc的区别
  6. Apache Mahout 0.9、10.1、11. CardinalityException: Required cardinality 60 but got 29
  7. 看似无参却有参-----JS中的函数传参
  8. php recordarray,php5.5新数组函数array-column使用实例
  9. hihoCoder1687(向量叉积)
  10. 常用ColorMatrixFilter收集
  11. Drools 规则引擎一文读懂
  12. python拍照搜题_OCR拍照搜题
  13. Echarts美国地图
  14. UML统一建模语言是什么?
  15. 手机app通用模板蓝色系用户登录页面
  16. 计算机最近被访问的文件夹,电脑复制文件夹提示“目标文件夹访问被拒绝”怎么办?[多图]...
  17. SF18 | MACD顶底背离+动态区间交易模型源码(技术贴)
  18. Android基于安卓手机个人理财系统
  19. c++---constructor(ctor,构造函数)
  20. 商城会员积分过期的实现方案

热门文章

  1. 部署shiro官方源码时,执行maven命令出错
  2. 在eclipse中关于Spring和Hibernate 的XML配置如何提示类的包路径的办法
  3. 将编号为0和1的两个栈存放于一个数组空间V[m]中。
  4. 《此生未完成》痛句摘录(2)
  5. 《金色梦乡》金句摘抄(八)
  6. 多功能语音播放器上线啦~
  7. linux跑循环脚本占内存,Linux下实现脚本监测特定进程占用内存情况
  8. Google浏览器截长图 不需要借助任何插件!!!
  9. 服务器io修改,更改 Linux I/O 调度器来改善服务器性能
  10. 炒菜机器人的弊端_机器人炒菜真不是你想的那样!