Как я могу получить определенные объявления пространства имен после демаршаллинга с помощью JAX-B? - PullRequest
1 голос
/ 02 апреля 2012

У меня есть документ XML, который включает выражения XPath, которые мне нужно использовать в моем приложении. Так как я должен определить пространства имен для Jaxen, мне нужно извлечь пространства имен, которые были в исходном XML-документе после того, как он был разархивирован JAX-B. Как мне получить извлеченные объявленные пространства имен? Спасибо.

(* Chris *)

Подробнее:

Мне нужно предоставить пространства имен для процессора 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 ]

1 голос
/ 03 апреля 2012

Обычно объекты jaxb разбираются на основе их пространства имен, поэтому пространство имен связано с вашими объектами JAXB.В частности, если вы сгенерировали свои классы JAXB из XSD, пакет (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();
0 голосов
/ 06 апреля 2012

В продолжение моего комментария выше:

В частности, пространство имен sif само по себе не связано ни с одним элементом или атрибутом в вашем 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 или любому другому модулю.

...