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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Jaxb对xml报文头的小修小改

發布時間:2024/1/17 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Jaxb对xml报文头的小修小改 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

前言:
  也是在實際工作中, 借助jaxb來實現xml到java對象的映射轉換. 在實際應用中, 也遇到了一些有趣好玩的東西, 權當記錄下來.
  本文主要講解jaxb如何生成約定的xml報文頭的實現思路, 點比較小, 而且方法有點trick, 因此導致取博文標題的時候, 也有些小迷茫, ^_^.

?

現象:
  我們先來定義一個簡單的java類, 并用于生成其對應的xml內容.

@Getter@Setter@NoArgsConstructor@AllArgsConstructor@XmlAccessorType(XmlAccessType.FIELD)@XmlRootElement(name="root")public static class TNode {@XmlElement(name="key", required = true)private String key;@XmlElement(name="value", required = true)private String value;}public static void main(String[] args) {TNode obj = new TNode("key_1", "val_1");try {JAXBContext jc = JAXBContext.newInstance(TNode.class);Marshaller marshaller = jc.createMarshaller();marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");StringWriter writer = new StringWriter();marshaller.marshal(obj, writer);System.out.println(writer.toString());} catch (JAXBException e) {e.printStackTrace();}}

  注: 這是簡單的實體類, 以及對應的jaxb生成xml的代碼
  具體的生成結果如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <root><key>key_1</key><value>val_1</value> </root>

  在默認的xml報文頭里, 比常見的多了一個standalone="yes" , 有沒有辦法去掉這個小尾巴呢?

?

嘗試思路:
  Marshaller類定義了很多屬性, 我們先來看一下有沒有報文頭相關的配置.

public interface Marshaller {// *) 指定編碼模式public static final String JAXB_ENCODING = "jaxb.encoding";// *) 指定輸出時, 是否支持縮進和換行public static final String JAXB_FORMATTED_OUTPUT = "jaxb.formatted.output";/*** The name of the property used to specify the xsi:schemaLocation* attribute value to place in the marshalled XML output.*/public static final String JAXB_SCHEMA_LOCATION = "jaxb.schemaLocation";/*** The name of the property used to specify the* xsi:noNamespaceSchemaLocation attribute value to place in the marshalled* XML output.*/public static final String JAXB_NO_NAMESPACE_SCHEMA_LOCATION = "jaxb.noNamespaceSchemaLocation";// *) 是否生成報文頭public static final String JAXB_FRAGMENT = "jaxb.fragment";}

  讓人有點小失望, 里面涉及報文頭的信息, 只有兩個, JAXB_ENCODING控制編碼, JAXB_FRAGMENT控制報文頭的可見性, 對standalone的可見性沒有配置項. 看來這條路是行不通的.

?

解決思路:
  本來覺得jaxb提供了一些listener是可以實現這個功能, 不過還沒研究. 無意中, 看到網友寫了一段輸出xml的代碼, 突然想到他或許也遇到了同樣的問題, 只是沒把為什么這樣做的目的寫出來.
  我們重新修改下生成xml的代碼:

public static void main(String[] args) {TNode obj = new TNode("key_1", "val_1");try {JAXBContext jc = JAXBContext.newInstance(TNode.class);Marshaller marshaller = jc.createMarshaller();marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// 1) 隱去報文頭的生成, Marshaller.JAXB_FRAGMENT默認為falsemarshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);StringWriter writer = new StringWriter();// 2) 自定義生成writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");marshaller.marshal(obj, writer);System.out.println(writer.toString());} catch (JAXBException e) {e.printStackTrace();}}

  注: 兩個要點, 1. 激活JAXB_FRAGMENT為true, 隱去jaxb自動生成xml報文頭. 2. 自定義輸出報文頭信息
  測試一下, 結果如下:

<?xml version="1.0" encoding="UTF-8" ?> <root><key>key_1</key><value>val_1</value> </root>

?

總結:
  這也算得上一篇博客水文, 這邊就當學習筆記, 拋磚引玉. 后續想對jaxb的性能優化, 以及內部的實現機制多多深入研究一下.

?

轉載于:https://www.cnblogs.com/mumuxinfei/p/8985269.html

總結

以上是生活随笔為你收集整理的Jaxb对xml报文头的小修小改的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。