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