>  기사  >  Java  >  Java의 JAXB 네임스페이스 및 접두사에 대한 자세한 예

Java의 JAXB 네임스페이스 및 접두사에 대한 자세한 예

黄舟
黄舟원래의
2017-08-23 10:53:482089검색

이 글에서는 주로 JAXB 네임스페이스와 접두사에 대한 관련 정보를 샘플 코드를 통해 자세히 소개합니다. 필요한 모든 사람의 학습이나 참조를 위해 아래 편집기를 방문하세요. 함께 배우세요.

이 글에서는 dom4j의 XMLFilterImpl 필터와 결합된 jaxb를 사용하여 직렬화 및 역직렬화를 완벽하게 제어하는 ​​방법을 설명합니다.

주로 다음 기능을 구현합니다.

  •  직렬화 및 역직렬화 중에 네임스페이스를 무시합니다

  •  이용하세요 @XmlRootElement(namespace="http://www.lzrabbit.cn") 직렬화 시 클래스의 기본 네임스페이스로 주석을 추가하여 네임스페이스 접두사를 완전히 제거

  •  참조된 클래스를 다른 네임스페이스로 직렬화할 때 네임스페이스 접두사는 생성되지 않지만 특정 xml 노드에 해당 xmlns 선언을 추가합니다.

  •  기타 xml 노드 명명 및 네임스페이스 요구 사항

  •  동일한 패키지에 여러 네임스페이스

  •  사용자 정의 네임스페이스 접두사

종속성 jar dom4j

의 기본 원칙


rreee

XMLFilterImpl의 익명 구현 클래스를 사용하여 직렬화 및 역직렬화 중에 네임스페이스 및 xml 노드 이름을 제어하여 더 이상 고민할 필요 없이 코드로 직접 이동하세요. 더 개인화된 요구 사항이 있으면 직접 확장하세요.


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

엔티티 클래스 예시



package com.bjpowernode.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());
  }
 }
}

Call


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.cnblogs.com/")
 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;
 }
}

출력 결과:


import com.bjpowernode.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은 우리의 기대를 완전히 충족합니다.


구현 세부 사항은 다음과 같습니다. 특별한 요구 사항이 있는 xml 네임스페이스 문제가 발생하면 더 이상 걱정할 필요가 없습니다.

요약

위 내용은 Java의 JAXB 네임스페이스 및 접두사에 대한 자세한 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.