日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在JAXB解组期间应用名称空间 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

對(duì)于某些XML模式來說,它是一組嚴(yán)格的規(guī)則,用于規(guī)定XML文檔的結(jié)構(gòu)方式。 但是對(duì)于其他人來說,通常的準(zhǔn)則是指出XML的外觀。 這意味著有時(shí)出于某些原因人們希望接受不符合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;}}


包裝信息

我們將使用包級(jí)別@XmlSchema批注為模型指定名稱空間限定。

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


XML輸入(input.xml)

即使我們的元數(shù)據(jù)指定所有元素都應(yīng)使用命名空間(http://www.example.com/customer)限定,我們的輸入文檔也不是使用命名空間限定的。 在解組操作期間,將使用XMLFilter添加名稱空間。

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


XMLFilter(NamespaceFilter)

創(chuàng)建XMLFilter的最簡(jiǎn)單方法是擴(kuò)展XMLFilterImpl 。 對(duì)于我們的用例,我們將覆蓋startElement和endElement方法。 在這些方法的每一個(gè)中,我們將調(diào)用相應(yīng)的super方法,并將默認(rèn)名稱空間作為URI參數(shù)傳遞。

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


演示版

在下面的演示代碼中,我們將對(duì)XML文檔進(jìn)行SAX解析。 XMLReader將包裝在我們的XMLFilter中 。 我們將利用JAXB的UnmarshallerHandler作為ContentHandler 。 解析完成后,我們可以向UnmarshallerHandler請(qǐng)求生成的Customer對(duì)象。

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


輸出量

以下是運(yùn)行演示代碼的輸出。 注意輸出如何包含基于元數(shù)據(jù)的名稱空間限定。

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


進(jìn)一步閱讀

如果您喜歡這篇文章,那么您可能也會(huì)對(duì)以下內(nèi)容感興趣:

  • JAXB和命名空間
  • 防止JAXB中的實(shí)體擴(kuò)展攻擊


參考:在Java XML&JSON Binding博客上,我們的JCG合作伙伴 Blaise Doughan 在JAXB Unmarshal期間應(yīng)用名稱空間 。

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

總結(jié)

以上是生活随笔為你收集整理的在JAXB解组期间应用名称空间的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。