MOXy @XmlPath注释不能多次读取相同的XPath

时间:2018-01-21 22:26:05

标签: java xml xpath moxy

我一直在努力使下面的程序工作,但在我的代码或@XmlPath注释中似乎存在一些严重的缺陷。 我试图解析的XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<information>
    <customer id="customer1">
        <billingAddress id="address1">
            <street id="street1">1 Billing Street</street>
            <street id="street2">2 Billing Street</street>
        </billingAddress>
    </customer>
</information>

我正在创作的Pojo:

package parser;


import lombok.ToString;
import org.eclipse.persistence.oxm.annotations.XmlPath;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

@ToString
@XmlRootElement(name = "information")
@XmlAccessorType(XmlAccessType.FIELD)
public class Information {

    @XmlPath("customer/@id")//-------------------------------------> (1)
    private String customerId;

    @XmlPath("customer[@id='customer1']/billingAddress/@id") //-----> (2)
    private String billingAddressId;                          

}

我如何解组xml:

import parser.Information;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.File;

public class Main {
    public static void main(String[] args) throws JAXBException {
        JAXBContext jaxbContext =  org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(new Class[]{Information.class}, null);
        Unmarshaller jaxbMarshaller = jaxbContext.createUnmarshaller();

        Information information = (Information)jaxbMarshaller.unmarshal(new File("information.xml"));
        System.out.println(information);
    }
}

以上输出为:

Information(customerId=null, billingAddressId=address1)

显然输出不正确。 customerId正在显示null而不是customer1。但是,如果我在pojo类中注释掉第(2)行,那么customerId将获得正确的值。为什么会这样?为什么我无法在上述程序中读取正确的customerId值?

1 个答案:

答案 0 :(得分:1)

从第二个[@id='customer1']中删除XmlPath确实解决了所提供代码的问题,即使我假设真实的信息实体还有更多的字段可以通过XmlPath解决。

为什么不使用某些类来反映XML结构......有点像面向对象?它将简化JAXB建模。