在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 Binding博客上,我們的JCG合作伙伴 Blaise Doughan 在JAXB Unmarshal期間應用名稱空間 。

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370374.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370374.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370374.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java怎么把文件寫入到usb里_如何創建PowerShell腳本以將文件復制到USB閃存驅動器?...

此代碼最后準備使用可移動驅動器(例如插入的USB驅動器)&#xff1a;$drives [System.IO.DriveInfo]::GetDrives()$r $drives | Where-Object { $_.DriveType -eq Removable -and $_.IsReady }if ($r) {return ($r)[-1]}throw "No removable drives found."這種方式…

利用css transition屬性實現一個帶動畫顯隱的微信小程序部件

我們先來看效果圖 像這樣的一個帶過渡效果的小部件在我們實際開發中的應用幾率還是比較大的&#xff0c;但是在開發微信小程序的過程中可能有的小伙伴發現transition這個屬性它不好使&#xff08;下面說明&#xff09;所以我們這個時候會考慮去使用微信官方提供的wx.createAnim…

c語言學生管理系統鏈表(dev vs2012下可以運行)

struct student { char name[10]; char sex[5]; long int num;//學號 int xuhao; int age; float score[3]; float averange; char DJ;//存放等級哦 struct student *next;};//定義結構體變量保存 名字 性別 年齡 成績] 結構體聲明int n;//存放學生人數int man;//存放統計的男生…

python 東哥 with open_python 連接redis cluster

#!/usr/bin/env python# encoding: utf-8#author: 東哥加油!#file: clear_pool.py#time: 2018/8/28 17:06from rediscluster import StrictRedisClusterimport datetimeimport sysdef redis_cluster():redis_nodes [{host:192.168.15.6,port:6379},{host:192.168.15.7,port:63…

go gcc

http://www.cnblogs.com/zkweb/p/7880099.html轉載于:https://www.cnblogs.com/thrillerz/p/7958446.html

抽象工廠設計模式解釋

抽象工廠設計模式是工廠設計模式的另一種形式。 這種模式可以被視為“超級工廠”或“工廠工廠”。 抽象工廠設計模式&#xff08;屬于“四人幫”的一部分&#xff09;屬于“創新設計模式”類別&#xff0c;它提供了一種封裝一組具有公共鏈接的工廠的方法&#xff0c;而無需突出…

app賬號退不出去_最新!多交的稅可以退,同學,你今天退稅了嗎?

4.3 號 更新。1、有知友留言&#xff0c;已經收到退稅了。2、部分地區陸續開放申報了&#xff0c;建議大家不要著急。3、大家耐心一點&#xff0c;該是你的就是你的&#xff0c;退稅這個事多退少補&#xff0c;建議大家在白天上班時間去APP上看看&#xff0c;畢竟相關公務人員也…

【BZOJ2004】[Hnoi2010]Bus 公交線路 狀壓+矩陣乘法

【BZOJ2004】[Hnoi2010]Bus 公交線路 Description 小Z所在的城市有N個公交車站&#xff0c;排列在一條長(N-1)km的直線上&#xff0c;從左到右依次編號為1到N&#xff0c;相鄰公交車站間的距離均為1km。 作為公交車線路的規劃者&#xff0c;小Z調查了市民的需求&#xff0c;決定…

課時77.序選擇器(掌握)

CSS3中新增的選擇器最具代表性的就是序選擇器。 1.同級別的第幾個 1. :first-child 選中同級別中的第一個標簽 注意點&#xff1a;不區分類型 但是我們這里有一個注意點&#xff0c;如果我們在第一個p之前加一個h1&#xff0c;則第一個p就不變紅了&#xff0c;因為我們…

Gulp——文件壓縮和文件指紋

先看下文件指紋添加成功發布后的“成果”。 首先介紹下gulp的文件壓縮&#xff08;壓縮css和js&#xff09; &#xff08;下面介紹的代碼移步這里&#xff09; 我的文件目錄如下&#xff1a; &#xff08;標紅部分是生成的處理后的文件&#xff09; 如何使用gulp&#xff0c;請…

java afconsole_Java ——基礎語法

package myhello; //本類所在的包的路徑import af.util.AfMath;//導入對應的類import java.util.Random;//導入隨機數的類public classHelloWorld{public static voidmain(String[] args){int a 8;inti;int total 0;int score 80;System.out.println(a > 8);//空語句 只有…

Java 7:使用NIO.2進行文件過濾-第2部分

大家好。 這是使用NIO.2系列進行文件過濾的第2部分。 對于那些尚未閱讀第1部分的人 &#xff0c;這里有個回顧。 NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API&#xff0c;您可以執行與java.io相同的操作&#xff0c;以及許多出色的功能&#xff0c;例如&a…

js for 循環 添加tr td 算法

StringBuffer sbnew StringBuffer(); int n 5; sb.append("<tr>"); List<MenuBean> chs mb.getChildren(); for(int j 0; chs ! null && j < chs.size(); j){ MenuBean _mb2 chs.get(j); if (i % n 0)//被n整除&#xff0c;即有了n列之后…

1034. 二哥的金鏈

Description 一個陽光明媚的周末&#xff0c;二哥出去游山玩水&#xff0c;然而粗心的二哥在路上把錢包弄丟了。傍晚時分二哥來到了一家小旅店&#xff0c;他翻便全身的口袋也沒翻著多少錢&#xff0c;而他身上唯一值錢的就是一條漂亮的金鏈。這條金鏈散發著奇異的光澤&#xf…

課時76.兄弟選擇器(掌握)

我們先來明確一點&#xff0c;什么是兄弟&#xff1f; 比如&#xff0c;head和body是兄弟&#xff0c;必須是同級關系&#xff0c;如果是嵌套關系&#xff0c;兒子&#xff0c;孫子則不可以。 1.相鄰兄弟選擇器 CSS2 作用&#xff1a;給指定選擇器后面緊跟的那個選擇器選中的…

java中不能定義為變量名稱_Java,“變量名”不能解析為變量

我使用Java使用Eclipse&#xff0c;出現此錯誤&#xff1a;"Variable name" cannot be resolved to a variable.使用此Java程序&#xff1a;public class SalCal {private int hoursWorked;public SalCal(String name, int hours, double hoursRate) {nameEmployee …

24v開關電源維修技巧_康佳LED液晶彩電KPS+L1900C301電源板原理與維修

康佳液晶彩電采用的KPSL1900C3-01型電源板&#xff0c;編號為34007728&#xff0c;版本號為35015686集成電路采用FAN7530FSGM300FSFR1700組合方案&#xff0c;輸出5.1VSB/4A、24V/4A、12V/4A電壓。應用于康佳LED47IS988PD、LED42M11PD、LED46MS92DC、LED42IS988PDE、LED42X5000…

zookeeper集群 新手安裝指南

Zookeeper集群的角色&#xff1a; Leader 和 follower &#xff08;Observer&#xff09;zk集群最好配成奇數個節點只要集群中有半數以上節點存活&#xff0c;集群就能提供服務本事例采用版本:zookeeper-3.4.5 虛擬機:zk1 zk2 zk3/****************************************…

Google Guava并發– ListenableFuture

在上一篇文章中&#xff0c;我介紹了使用番石榴庫中com.google.common.util.concurrent包中的Monitor類。 在本文中&#xff0c;我將繼續介紹Guava并發實用程序&#xff0c;并討論ListenableFuture接口。 ListenableFuture通過添加接受完成偵聽器的方法&#xff0c;從java.util…

課時71.后代選擇器(掌握)

1.什么是后代選擇器&#xff1f; 作用&#xff1a;找到指定標簽的所有后代標簽&#xff0c;設置屬性。 首先你要明確什么是后代&#xff1f; 你的兒子&#xff0c;孫子&#xff0c;重孫子等&#xff0c;只要有你的血脈的&#xff0c;都是你的后代。 我們先來舉個例子 我們想…