Voy a simplificar mis clases y salida lo mejor que puedo aquí, pero básicamente lo que busco es que quiero agregar un org.w3c.dom.Element
(que representa un enlace atómico en este caso) a un JAXB Objeto, estoy volviendo. La clase JAXB se ve algo como:RESTeasy/JAXB; ¿Cómo evito que se agregue un espacio de nombre a un Elemento en una etiqueta <any>? (Lista <Element> en JAXB)
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
import org.w3c.dom.Element;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "People", namespace = "main", propOrder = {
"any",
"persons"
})
public class People {
@XmlAnyElement
protected List<Element> any;
@XmlElement(name = "person", namespace = "main")
protected List<Person> persons;
[...]
}
estoy creando el elemento utilizando una plantilla se crea de esta manera:
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
public class ElementGen {
public Element getTemplate() throws DOMException, SAXException, ParserConfigurationException {
final SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
final Schema schema = sf.newSchema(new StreamSource(
Thread.currentThread().getContextClassLoader().getResourceAsStream(ATOM_XSD)));
final DocumentBuilderFactory docBuilder = DocumentBuilderFactory.newInstance();
docBuilder.setSchema(schema);
final Document doc = docBuilder.newDocumentBuilder().newDocument();
linkTemplate = doc.createElementNS(ATOM_NAMESPACE, ATOM_LINK);
return linkTemplate;
}
}
(Eso no es realmente lo que la clase se parece, sólo estoy tratando para que sea tan fácil como sea posible compilar algo para probarlo sin todo el lío externo).
entonces clonar esa plantilla usando linkTemplate.cloneNode(false);
Ahora todo esto funciona en el que devuelve XML, pero lo más curioso es que el xml que regrese tiene espacios de nombres adicionales unidos:
<atom:link xmlns:ns3="main" xmlns="" href="href" rel="rel"/>
Si yo añadir linkTemplate.setAttribute("xmlns", null);
los "xmlns: NS3" espacio de nombres desaparece y me sale:
<atom:link xmlns="" href="href" rel="rel"/>
Pero parece que no hay manera de eliminar que xmlns = "". ¿Estoy creando el Elemento de la manera incorrecta? ¿O tal vez algo más está yendo mal? No entiendo por qué se está agregando esto, así que cualquier ayuda/explicación sería apreciada.
Editar: Creo que debe estar relacionado con el espacio de nombre del documento que uso para generar el Elemento, pero no estoy seguro de cómo solucionarlo. ¿Hay alguna forma de establecer el targetNamespace (XML) en el documento?
Edit 2: No estoy seguro si agrega algo útil para cualquier persona, pero con más experimentación encontré que linkTemplate.setAttribute("xmlns:" + anything, null);
tiene el efecto de crear un enlace con xmlns:[anything]=""
y eliminar cualquier otro que de otro modo se hubiera generado.
Editar 3: Los bits correspondientes de la xsd utilizados para generar los objetos JAXB es:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0"
xmlns="main"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:atom="http://www.w3.org/2005/Atom"
targetNamespace="main"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:complexType name="People">
<xs:sequence>
<xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="person" type="Person" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
[attributes]
</xs:complexType>
[other types etc.]
Sí, lo es. Y me di cuenta de que después de escribir la pregunta, pero el resultado desafortunadamente es el mismo. : \ – Thor84no
puede publicar su código actualizado? – jtahlborn
Eh. Es solo literalmente eso. ATOM_LINK ahora es "átomo: enlace" y setPrefix se ha ido. También traté de crear un elemento raíz y hacer que este elemento fuera un elemento secundario de eso, pero no hizo nada, así que lo eliminé nuevamente. – Thor84no