2012-12-28 65 views
1

我目前使用EclipseLink MOXy 2.4.1并尝试通过XPath更新元素的值。 输入的是:使用EclipseLink MOXy和JAXB的复杂XPath

<?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> 

的XSD是

<?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> 

而且我的Java代码:使用莫西的工具

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 **/ 

我从XSD创建了我的java类“JAXB -compiler.cmd”。 从上面的代码可以看出,我试图将第一项的数量设置为“100.11”。但它没有设定价值,也没有抛出任何异常。 我试着设置上面使用XPath这样

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

的用户名和,它不设置/正确更新值。 您可以请告诉我如何设置Predicates的复杂XPath值?事情是这样的:

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

回答

0

最近,我们修正了我们的EclipseLink 2.4.2和2.5.0的相关设置,其中的XPath包含postional指标(即"foo[1]/bar[2]/text()")值流。您可以从下面的链接下载一个每晚构建:

您可以映射,使用谓词与@XmlPath(参见:http://blog.bdoughan.com/2011/03/map-to-element-based-on-attribute-value.html),但我们目前不支持此我们呼吁setValueByXPath 。你可以打开增强功能

相关问题