2012-12-28 1 views
1

J'utilise actuellement EclipseLink MOXy 2.4.1 et je tente de mettre à jour la valeur d'un élément via XPaths. L'entrée utilisée est:XPaths complexes utilisant EclipseLink MOXy et JAXB

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<expenseReport> 
    <user> 
     <userName>Sanaulla</userName> 
    </user> 
    <items> 
     <item> 
      <itemName>Seagate External HDD</itemName> 
      <purchasedOn>August 24, 2010</purchasedOn> 
      <amount>6776.5</amount> 
     </item> 
     <item> 
      <itemName>External HDD</itemName> 
      <purchasedOn>August 24, 2010</purchasedOn> 
      <amount>677336.5</amount> 
     </item> 
    </items> 
</expenseReport> 

Le XSD est

<?xml version="1.0"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="expenseReport" type="ExpenseT"/> 
    <xs:complexType name="ExpenseT"> 
     <xs:sequence> 
      <xs:element name="user" type="UserT"/> 
      <xs:element name="items" type="ItemListT"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="UserT"> 
     <xs:sequence> 
      <xs:element name="userName" type="xs:string"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="ItemListT"> 
     <xs:sequence> 
      <xs:element name="item" type="ItemT" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="ItemT"> 
     <xs:sequence> 
      <xs:element name="itemName" type="xs:string"/> 
      <xs:element name="purchasedOn" type="xs:string"/> 
      <xs:element name="amount" type="xs:decimal"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

Et mon code Java est:

JAXBContext context = JAXBContext.newInstance("sample.jaxb.xsd"); 
JAXBElement<ExpenseT> element = (JAXBElement<ExpenseT>)unmarshaller.unmarshal(new File("resources/sample_before.xml")); 
ExpenseT expenseReport = element.getValue(); 
context.setValueByXPath(expenseReport, "items/item[1]/amount/text()", null, "100.11"); 
/** Marshalling code **/ 

Je mes classes java créé à partir du XSD en utilisant l'outil de Moxy « JAXB -compiler.cmd ". Comme vous pouvez le voir dans le code ci-dessus, j'essaye de régler le montant du 1er article sur "100.11". Mais il ne définit pas la valeur et ne lance aucune exception. Je essayé de placer le nom d'utilisateur ci-dessus en utilisant XPath comme celui-ci

context.setValueByXPath(expenseReport, "user/userName/text()", null, "ABC"); 

Et, il ne fixe/mettre à jour la valeur correctement. Pouvez-vous s'il vous plaît conseiller sur comment puis-je définir des valeurs pour XPaths complexes avec Predicates? Quelque chose comme ceci:

items/item[itemName='Seagate External HDD']/amount 

Répondre

0

Nous avons récemment corrigé un bug dans notre EclipseLink 2.4.2 et 2.5.0 flux liés à la définition des valeurs dans lesquelles le XPath contient un indicateur postional (c.-à-"foo[1]/bar[2]/text()"). Vous pouvez télécharger une nightly build à partir du lien suivant:

Vous pouvez utiliser des prédicats dans les correspondances avec @XmlPath (voir: http://blog.bdoughan.com/2011/03/map-to-element-based-on-attribute-value.html), mais nous ne prend actuellement en charge pas avec notre setValueByXPath appel . Pourriez-vous ouvrir une amélioration?

Questions connexes