如何在使用JAX-B解组后检索已定义的命名空间声明

时间:2012-04-02 19:05:42

标签: xml namespaces jaxb

我有一个XML文档,其中包含我需要在我的应用程序中使用的XPath表达式。由于我必须将命名空间定义为Jaxen,因此我需要在JAX-B解组之后检索原始XML文档中的命名空间。我将如何检索声明的命名空间?感谢。

(*克里斯*)

更多信息:

我需要在应用映射时将命名空间提供给JDOM / Jaxen XPath处理器。 (/.../用于简洁)

<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>

2 个答案:

答案 0 :(得分:1)

通常,jaxb对象根据其命名空间进行解组,因此命名空间与JAXB对象相关联。特别是,如果从XSD生成JAXB类,则包(jaxbObject.getCLass()。getPackage()将具有包含声明的命名空间的注释信息。

您可以通过艰难的方式完成它并查找包对象及其注释,也可以使用上下文实例中的JAXBIntrospector。假设你的jaxb对象是'jaxbObject'而'jaxbContent'是你的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();

答案 1 :(得分:0)

跟进我上面的评论:

更具体地说,sif namepsace与XML文档本身中的任何元素或属性都没有关联,因此声明xmlns:sif =“xxx”并不重要,包括JAXB。它仅与解释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>

因此,我建议将名称空间声明添加为应用程序与值节点一起处理的显式节点,然后您应该能够传递给jaxen或任何其他模块。