/ / ¿Cómo puedo recuperar las declaraciones de espacio de nombres definidas después de desarmar con JAX-B - xml, namespaces, jaxb

¿Cómo puedo recuperar las declaraciones de espacio de nombres definidas después de desmarcarlas con JAX-B - xml, namespaces, jaxb?

Tengo un documento XML que incluye XPathexpresiones que necesito usar en mi aplicación. Como tengo que definir los espacios de nombres para Jaxen, necesito recuperar los espacios de nombres que estaban en el documento XML original después de que JAX-B lo desarme. ¿Cómo haría para recuperar los espacios de nombres declarados? Gracias.

(* Chris *)

Más información:

Necesito proporcionar los espacios de nombres al procesador JDOM / Jaxen XPath cuando aplique las asignaciones. (/.../ utilizado por brevedad)

<mappings set="RTE" xmlns="http://www.powerschool.com/mappings" xmlns:sif="http://www.sifinfo.org/infrastructure/2.x" xmlns:ntc="http://stumo.transcriptcenter.com">
<mapping name="Area">
<endpoint end="SIF" type="XML">
<xpath>/sif:StudentRecordExchangeData/.../sif:SIF_ExtendedElement[@Name="StudentDemographicRecordExtensions"]/.../ntc:Area</xpath>
</endpoint>
</mapping>
</mappings>

Respuestas

0 para la respuesta № 1

Siguiendo con mi comentario anterior:

Más específicamente, la sif namepsace no esasociado con cualquier elemento o atributo en su documento XML per-se, y por lo tanto la declaración xmlns: sif = "xxx" es irrelevante, incluso para JAXB. Solo es relevante para la aplicación que interpreta el valor de mapping.endpoint.xpath.

<mappings set="RTE" xmlns="http://www.powerschool.com/mappings" >
<mapping name="Area">
<endpoint end="SIF" type="XML" namespaces="sif=http://www.sifinfo.org/infrastructure/2.x ntc=http://stumo.transcriptcenter.com">
<xpath>/sif:StudentRecordExchangeData/.../sif:SIF_ExtendedElement[@Name="StudentDemographicRecordExtensions"]/.../ntc:Area</xpath>
</endpoint>
<!-- or: -->
<endpoint end="SIF" type="XML">
<namespace prefix="sif">http://www.sifinfo.org/infrastructure/2.x</namespace>
<namespace prefix="ntc">http://stumo.transcriptcenter.com</namespace>
<xpath>/sif:StudentRecordExchangeData/.../sif:SIF_ExtendedElement[@Name="StudentDemographicRecordExtensions"]/.../ntc:Area</xpath>
</endpoint>
</mapping>
</mappings>

Por lo tanto, estoy proponiendo agregar el espacio de nombresdeclaración como nodos explícitos para que su aplicación procese junto con el nodo de valor, entonces debería poder pasar a jaxen o cualquier otro módulo.


1 para la respuesta № 2

Normalmente, los objetos jaxb se basan sin ordenaren su espacio de nombres, por lo que el espacio de nombres está asociado con sus objetos JAXB. En particular, si generó sus clases JAXB desde XSD, el paquete (jaxbObject.getCLass (). GetPackage () tendrá información de anotación que incluye el espacio de nombres declarado.

Puedes hacerlo de la manera difícil y buscarpaquete de objetos y su anotación, o puede usar el JAXBIntrospector de su instancia de contexto. Asumiendo que su objeto jaxb es "jaxbObject" y "jaxbContent" es su instancia JAXBContext:

 JAXBIntrospector introspector = jaxbContext.createJAXBIntrospector();
if (!introspector.isElement(jaxbObject))
throw new JAXBException("Type "" + objectToMarshall.getClass().getName() + "" is not a JAXB object.");

QName qname = introspector.getElementName(jaxbObject);
if (qname == null)
throw new JAXBException("Type "" + jaxbObject.getClass().getName()
+ "" is not a JAXB object instance.");

String namespaceUri = qname.getNamespaceURI();