Dieser Artikel führt Sie hauptsächlich in die relevanten Informationen zum JAXB-Namespace und den Präfixen ein. Der Artikel stellt ihn im Detail anhand des Beispielcodes vor gemeinsam lernen.
In diesem Artikel wird erläutert, wie Sie Jaxb in Kombination mit dem XMLFilterImpl-Filter von dom4j verwenden, um eine vollständige Kontrolle über Serialisierung und Deserialisierung zu erreichen
Implementieren Sie hauptsächlich die folgenden Funktionen
Ignorieren Sie den Namespace beim Serialisieren und Deserialisieren
Verwenden Sie beim Serialisieren die Annotation @XmlRootElement(namespace="http://www.lzrabbit.cn")
als Standard-Namespace der Klasse und eliminieren Sie den Namespace vollständig Präfix
Bei der Serialisierung hat die referenzierte Klasse einen anderen Namespace. Das Namespace-Präfix wird nicht generiert, aber die entsprechende XMLNS-Deklaration wird dem spezifischen XML-Knoten
Abhängiges Glas dom4j
<dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency>Das Hauptprinzip besteht darin, das zu steuern Namespace und XML-Knotenname über die anonyme Implementierungsklasse von XMLFilterImpl während der Serialisierung und Deserialisierung, um unterschiedliche Anforderungen zu erfüllen. Wenn Sie weitere personalisierte Anforderungen haben, erweitern Sie bitte Ihre eigenen
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()); } } }Beispiel-Entitätsklasse
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; } }Aufruf
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)); } }Ausgabeergebnis:
<?xml version="1.0" encoding="UTF-8"?> <classA xmlns="http://www.lzrabbit.cn/"> <classAId>11</classAId> <ClassAName>A1</ClassAName> <classB xmlns="http://www.cnblogs.com/"> <ClassBId>22</ClassBId> <ClassBName>B2</ClassBName> </classB> </classA>Sie können sehen, dass die Ausgabe-XML vollständig unsere Erwartungen erfüllt
Zusammenfassung
Das obige ist der detaillierte Inhalt vonDetailliertes Beispiel für den JAXB-Namespace und das Präfix in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!