<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      JAXB玩轉命名空間

      聲明:如果你正在發愁xml命名空間及其前綴問題,那么請繼續,否則請跳過

      本文講解使用jaxb結合dom4j的XMLFilterImpl過濾器實現序列化和反序列化的完全控制

      主要實現以下功能

      • 序列化及反序列化時忽略命名空間
      • 序列化時使用@XmlRootElement(namespace="http://www.lzrabbit.cn")注解作為類的默認命名空間,徹底消除命名空間前綴
      • 序列化時引用類有不同命名空間時也不會生成命名空間前綴,而是在具體的xml節點上添加相應的xmlns聲明
      • 其它的xml節點命名及命名空間需求
      • 同一個包下有多個命名空間
      • 自定義命名空間前綴

      依賴的jar dom4j

       <dependency>
                  <groupId>dom4j</groupId>
                  <artifactId>dom4j</artifactId>
                  <version>1.6.1</version>
       </dependency>

      主要原理就是在序列化和反序列化時通過XMLFilterImpl的匿名實現類實現命名空間及xml節點名稱的控制,實現多樣化需求,廢話不多說直接上代碼,有更多個性化需求的看官請自行擴展

      package cn.lzrabbit.util;
      
      import java.io.StringReader;
      import java.io.StringWriter;
      
      import javax.xml.bind.*;
      import javax.xml.transform.sax.SAXSource;
      
      import org.dom4j.io.OutputFormat;
      import org.dom4j.io.XMLWriter;
      import org.xml.sax.Attributes;
      import org.xml.sax.InputSource;
      import org.xml.sax.SAXException;
      import org.xml.sax.XMLReader;
      import org.xml.sax.helpers.XMLFilterImpl;
      import org.xml.sax.helpers.XMLReaderFactory;
      
      public class XmlUtil {
      
          public static String toXML(Object obj) {
              try {
                  JAXBContext context = JAXBContext.newInstance(obj.getClass());
      
                  Marshaller marshaller = context.createMarshaller();
                  marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// //編碼格式
                  marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// 是否格式化生成的xml串
                  marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);// 是否省略xm頭聲明信息
      
                  StringWriter out = new StringWriter();
                  OutputFormat format = new OutputFormat();
                  format.setIndent(true);
                  format.setNewlines(true);
                  format.setNewLineAfterDeclaration(false);
                  XMLWriter writer = new XMLWriter(out, format);
      
                  XMLFilterImpl nsfFilter = new XMLFilterImpl() {
                      private boolean ignoreNamespace = false;
                      private String rootNamespace = null;
                      private boolean isRootElement = true;
      
                      @Override
                      public void startDocument() throws SAXException {
                          super.startDocument();
                      }
      
                      @Override
                      public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
                          if (this.ignoreNamespace) uri = "";
                          if (this.isRootElement) this.isRootElement = false;
                          else if (!uri.equals("") && !localName.contains("xmlns")) localName = localName + " xmlns=\"" + uri + "\"";
      
                          super.startElement(uri, localName, localName, atts);
                      }
      
                      @Override
                      public void endElement(String uri, String localName, String qName) throws SAXException {
                          if (this.ignoreNamespace) uri = "";
                          super.endElement(uri, localName, localName);
                      }
      
                      @Override
                      public void startPrefixMapping(String prefix, String url) throws SAXException {
                          if (this.rootNamespace != null) url = this.rootNamespace;
                          if (!this.ignoreNamespace) super.startPrefixMapping("", url);
      
                      }
                  };
                  nsfFilter.setContentHandler(writer);
                  marshaller.marshal(obj, nsfFilter);
                  return out.toString();
      
              } catch (Exception e) {
                  throw new RuntimeException(e);
              }
          }
      
          public static <T> T fromXML(String xml, Class<T> valueType) {
              try {
                  JAXBContext context = JAXBContext.newInstance(valueType);
                  Unmarshaller unmarshaller = context.createUnmarshaller();
                  // return (T) unmarshaller.unmarshal(new StringReader(xml));
                  SerializeUtil obj = new SerializeUtil();
                  XMLReader reader = XMLReaderFactory.createXMLReader();
                  XMLFilterImpl nsfFilter = new XMLFilterImpl() {
                      private boolean ignoreNamespace = false;
      
                      @Override
                      public void startDocument() throws SAXException {
                          super.startDocument();
                      }
      
                      @Override
                      public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
                          if (this.ignoreNamespace) uri = "";
                          super.startElement(uri, localName, qName, atts);
                      }
      
                      @Override
                      public void endElement(String uri, String localName, String qName) throws SAXException {
                          if (this.ignoreNamespace) uri = "";
                          super.endElement(uri, localName, localName);
                      }
      
                      @Override
                      public void startPrefixMapping(String prefix, String url) throws SAXException {
                          if (!this.ignoreNamespace) super.startPrefixMapping("", url);
                      }
                  };
                  nsfFilter.setParent(reader);
                  InputSource input = new InputSource(new StringReader(xml));
                  SAXSource source = new SAXSource(nsfFilter, input);
                  return (T) unmarshaller.unmarshal(source);
              } catch (Exception e) {
                  throw new RuntimeException(e.getMessage());
              }
          }
      }
      View Code

      示例實體類

      import javax.xml.bind.annotation.*;
      
      @XmlRootElement(namespace="http://www.lzrabbit.cn/")
      @XmlAccessorType(XmlAccessType.FIELD)
      public class ClassA {
          private int classAId;
          
          @XmlElement(name="ClassAName")
          private String classAName;
      
          @XmlElement(namespace="http://www.rzrgm.cn/")
          private ClassB classB;
      
          public int getClassAId() {
              return classAId;
          }
          public void setClassAId(int classAId) {
              this.classAId = classAId;
          }
      
          public String getClassAName() {
              return classAName;
          }
      
          public void setClassAName(String classAName) {
              this.classAName = classAName;
          }
      
          public ClassB getClassB() {
              return classB;
          }
      
          public void setClassB(ClassB classB) {
              this.classB = classB;
          }
      }
      
      import javax.xml.bind.annotation.*;
      
      @XmlAccessorType(XmlAccessType.FIELD)
      public class ClassB {
          private int ClassBId;
          private String ClassBName;
      
          public int getClassBId() {
              return ClassBId;
          }
      
          public void setClassBId(int classBId) {
              this.ClassBId = classBId;
          }
      
          public String getClassBName() {
              return ClassBName;
          }
      
          public void setClassBName(String classBName) {
              this.ClassBName = classBName;
          }
      }
      View Code

      調用

      import cn.lzrabbit.util.XmlUtil;
      
      public class MainRun {
      
          /**
           * @param args
           */
          public static void main(String[] args) {
      
              ClassB classB = new ClassB();
              classB.setClassBId(22);
              classB.setClassBName("B2");
      
              ClassA classA = new ClassA();
              classA.setClassAId(11);
              classA.setClassAName("A1");
              classA.setClassB(classB);
      
              System.out.println(XmlUtil.toXML(classA));
          }
      
      }

      輸出結果:

      <?xml version="1.0" encoding="UTF-8"?>
      <classA xmlns="http://www.lzrabbit.cn/">
        <classAId>11</classAId>
        <ClassAName>A1</ClassAName>
        <classB xmlns="http://www.rzrgm.cn/">
          <ClassBId>22</ClassBId>
          <ClassBName>B2</ClassBName>
        </classB>
      </classA>

      可以看到輸出的xml完全達到我們的預期

      實現細節都在代碼里面了,很簡單,當遇到有特殊需求的xml命名空間問題時,再也不用愁了

       

      posted @ 2014-05-07 06:18  懶惰的肥兔  閱讀(10979)  評論(2)    收藏  舉報
      主站蜘蛛池模板: 亚洲综合一区二区三区视频| 久久午夜无码免费| 久久亚洲日韩精品一区二区三区| 亚洲国产天堂久久综合226114| 大陆熟妇丰满多毛xxxⅹ| 国产色悠悠综合在线观看| 深夜福利资源在线观看| 日本视频高清一区二区三区| 欧美亚洲综合久久偷偷人人| 亚洲av午夜成人片| 久久a级片| 被黑人巨大一区二区三区| 国模雨珍浓密毛大尺度150p| 老妇肥熟凸凹丰满刺激| 亚洲欧美牲交| aaa少妇高潮大片免费看| 被c到高潮疯狂喷水国产 | 国产精品一区二区三区四区| 亚洲天堂精品一区二区| 天天爱天天做天天爽夜夜揉| 无遮挡午夜男女xx00动态| 爱性久久久久久久久| 丰台区| 欧美日产国产精品日产| 热久久99精品这里有精品| 亚洲人妻精品一区二区| 成在人线av无码免费看网站直播| 亚洲69视频| 国产精品视频全国免费观看| 日韩精品卡一卡二卡三卡四| 国产果冻豆传媒麻婆精东| 日本无人区一区二区三区| 99久久亚洲综合精品成人网| 金沙县| 99热精品国产三级在线观看| 国产精品制服丝袜无码| 人人澡人摸人人添| 视频一区二区三区刚刚碰| 国产精品午夜无码AV天美传媒| 人妻少妇一区二区三区| 女性高爱潮视频|