Pregunta simplificada: ¿Qué es XPath para seleccionar todos los nodos XML con un atributo que finaliza con la cadena "Notificación". El primer y tercer nodos en este fragmento:Seleccionar nodos con XPath para vincular un subconjunto de clases con JAXB
<events>
<event name="CreatedNotification" />
<event name="InfoLog" />
<event name="UpdatedNotification" />
</events>
Pregunta detallada:
deseo seleccionar múltiples complexTypes de un esquema XSD para la unión con JAXB. Esto funciona para una sola clase: OrderStateChangeNotification
<jxb:bindings schemaLocation="apiv2.xsd">
<jxb:bindings node="//xs:complexType[@name='OrderStateChangeNotification']">
<inheritance:implements>com.google.checkout.sdk.notifications.Notification</inheritance:implements>
</jxb:bindings>
</jxb:bindings>
Aquí está el fragmento relevante desde el archivo de esquema esquema:
<xs:complexType name="OrderStateChangeNotification">
<xs:all>
<xs:element name="new-fulfillment-order-state" type="tns:FulfillmentOrderState" />
<xs:element name="new-financial-order-state" type="tns:FinancialOrderState" />
<xs:element name="previous-fulfillment-order-state" type="tns:FulfillmentOrderState" />
<xs:element name="previous-financial-order-state" type="tns:FinancialOrderState" />
<xs:element name="reason" type="xs:string" minOccurs="0" />
<xs:element name="timestamp" type="xs:dateTime" />
<xs:element name="google-order-number" type="xs:token" />
<xs:element name="order-summary" type="tns:OrderSummary" minOccurs="0" />
</xs:all>
<xs:attribute name="serial-number" type="xs:string" use="required" />
</xs:complexType>
<xs:complexType name="ChargeAmountNotification">
<xs:all>
<xs:element name="timestamp" type="xs:dateTime" />
<xs:element name="latest-charge-amount" type="tns:Money" />
<xs:element name="latest-charge-fee" type="tns:FeeStructure" minOccurs="0" />
<xs:element name="total-charge-amount" type="tns:Money" />
<xs:element name="latest-promotion-charge-amount" type="tns:Money" minOccurs="0" />
<xs:element name="google-order-number" type="xs:token" />
<xs:element name="order-summary" type="tns:OrderSummary" minOccurs="0" />
</xs:all>
<xs:attribute name="serial-number" type="xs:string" use="required" />
</xs:complexType>
Quiero que la unión a aplicarse a todos los objetos de notificación. Todos terminan con "notificación"
He intentado cambiar el XPath de
//xs:complexType[@name='OrderStateChangeNotification']
a
//xs:complexType[substring(name(), string-length(name()) - 12) = 'Notification']
pero no funcionó.
Otro enfoque es tratar de seleccionar todos los nodos con los niños "order-summary" y "serial-number", ya que solo sé que los objetos de notificación los tienen.
ACTUALIZACIÓN: La solución por @Lee Greco SELECTES correctamente los nodos que quería, pero por desgracia, el complemento de la herencia no es compatible con múltiples nodos:
[ERROR] XPath evaluation of "//xs:complexType[substring(@name, string-length(@name)-string-length('Notification')+1)='Notification']" results in too many (8) target nodes
Acabé la enumeración de ellos por separado.
Con el fin de apoyar a "múltiples nodos", utilizar el 'múltiple = "verdadero" 'configuración en' '. Ver la [discusión aquí] (http://java.net/projects/jaxb/lists/users/archive/2011-04/message/11) –
La última entrada en la [discusión] (http://java.net/projects/jaxb/lists/users/archive/2011-04/message/11) aún dice que no está funcionando. Tengo el mismo problema y aunque se aceptan multiple = true y required = false, jaxb todavía se ahoga con "XPath evaluation of" // xs: complexType "da como resultado demasiados (3) nodos de destino" .. – whaefelinger