使用EclipseLink MOXy和JAXB的复杂XPath

时间:2012-12-28 09:39:27

标签: xpath jaxb eclipselink moxy

我目前正在使用EclipseLink MOXy 2.4.1并试图通过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 **/

我使用Moxy的工具“jaxb-compiler.cmd”从XSD创建了我的java类。 从上面的代码中可以看出,我试图将第一项的数量设置为“100.11”。但它没有设置值,也没有抛出任何异常。 我尝试使用XPath设置上面的用户名

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

并且,它确实正确地设置/更新了值。 您能否告诉我如何使用Predicates为复杂的XPath设置值?像这样:

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

1 个答案:

答案 0 :(得分:0)

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

您可以在@XmlPath的映射中使用谓词(请参阅:http://blog.bdoughan.com/2011/03/map-to-element-based-on-attribute-value.html),但我们目前不支持setValueByXPath调用。你能打开一个增强功能

吗?