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

Xml 在使用JAX-B解组后,如何检索已定义的命名空间声明,xml,namespaces,jaxb,Xml,Namespaces,Jaxb,我有一个XML文档,其中包含我需要在应用程序中使用的XPath表达式。因为我必须为Jaxen定义名称空间,所以在原始XML文档被JAX-B解封后,我需要检索原始XML文档中的名称空间。我将如何检索声明的名称空间?谢谢 (*克里斯*) 更多信息: 在应用映射时,我需要向JDOM/jaxenxpath处理器提供名称空间。(/…/用于简洁) /sif:StudentRecordExchangeData/../sif:sif_ExtendedElement[@Name=“StudentDemograp

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

(*克里斯*)

更多信息:

在应用映射时,我需要向JDOM/jaxenxpath处理器提供名称空间。(/…/用于简洁)


/sif:StudentRecordExchangeData/../sif:sif_ExtendedElement[@Name=“StudentDemographicRecordExtensions”]/…/ntc:Area

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

您可以通过艰难的方式查找包对象及其注释,也可以从您的上下文实例中使用JAXBintSpector。因此,假设您的jaxb对象是“jaxbObject”,而“jaxbContent”是您的JAXBContext实例:

JAXBIntrospector introspector=jaxbContext.createJAXBIntrospector();
if(!introspector.isElement(jaxbObject))
抛出新的JAXBException(“Type'”+objectToMarshall.getClass().getName()+“'不是JAXB对象”);
QName QName=introspector.getElementName(JAXBObObject);
if(qname==null)
抛出新的JAXBException(“Type'”+jaxbObject.getClass().getName())
+“'不是JAXB对象实例。”);
字符串namespaceUri=qname.getNamespaceURI();

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

您可以通过艰难的方式查找包对象及其注释,也可以从您的上下文实例中使用JAXBintSpector。因此,假设您的jaxb对象是“jaxbObject”,而“jaxbContent”是您的JAXBContext实例:

JAXBIntrospector introspector=jaxbContext.createJAXBIntrospector();
if(!introspector.isElement(jaxbObject))
抛出新的JAXBException(“Type'”+objectToMarshall.getClass().getName()+“'不是JAXB对象”);
QName QName=introspector.getElementName(JAXBObObject);
if(qname==null)
抛出新的JAXBException(“Type'”+jaxbObject.getClass().getName())
+“'不是JAXB对象实例。”);
字符串namespaceUri=qname.getNamespaceURI();

跟进我的上述评论:

更具体地说,sif名称空间本身并不与XML文档中的任何元素或属性相关联,因此声明xmlns:sif=“xxx”并不重要,包括对JAXB而言。它只与解释mapping.endpoint.xpath值的应用程序相关


/sif:StudentRecordExchangeData/../sif:sif_ExtendedElement[@Name=“StudentDemographicRecordExtensions”]/…/ntc:Area
http://www.sifinfo.org/infrastructure/2.x
http://stumo.transcriptcenter.com
/sif:StudentRecordExchangeData/../sif:sif_ExtendedElement[@Name=“StudentDemographicRecordExtensions”]/…/ntc:Area

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

继续我上面的评论:

更具体地说,sif名称空间本身并不与XML文档中的任何元素或属性相关联,因此声明xmlns:sif=“xxx”并不重要,包括对JAXB而言。它只与解释mapping.endpoint.xpath值的应用程序相关


/sif:StudentRecordExchangeData/../sif:sif_ExtendedElement[@Name=“StudentDemographicRecordExtensions”]/…/ntc:Area
http://www.sifinfo.org/infrastructure/2.x
http://stumo.transcriptcenter.com
/sif:StudentRecordExchangeData/../sif:sif_ExtendedElement[@Name=“StudentDemographicRecordExtensions”]/…/ntc:Area

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

名称空间是在根元素上声明的还是在整个XML文档中声明的?因此,您试图提取与值节点关联的名称空间文档中的“sif”前缀。但它用于元素的值中,因此它实际上没有关联。我建议您在该xpath元素中使用“namespaceuri(s)”属性(如果不止一个,您可以使用逗号分隔语法或其他一些列表语法。您的命名空间是在根元素上声明的还是在整个XML文档中声明的?因此,您试图从文档中提取与“sif”前缀关联的命名空间。但它在元素的值中使用,因此它不是真正关联的。我建议您在该xpath元素中使用“namespaceuri(s)”属性(如果不止一个,您可以使用逗号分隔的语法或其他一些列表语法。我相信这将有效地获取JAX-B对象本身的名称空间,但如何获取解析XML中声明的名称空间。据我所知,我想您是在告诉我,JAX-B丢弃了它们,这很遗憾。这意味着我将声明已经在XML文档中占有一席之地的内容。感谢您提供的信息。我不认为我是在暗示。我假设原始(解析)XML文档中声明的名称空间与JAXB直接相关,就像直接映射到JAXB一样