使用MOXy或JAXB存储当前XML元素名称

时间:2015-04-29 02:42:37

标签: xml xpath jaxb eclipselink moxy

我正在使用StAX和MOXy的组合来解析XML文件。当我的解析器使用XPath检测到我在指定的元素时,我解组了该元素。有时,XPath可以表示多个XML元素。这是一个例子:

/a/b/*[self::c or self::d or self::e]

在此示例中,这些路径都是有效的:

/a/b/c
/a/b/d
/a/b/e

在我的一个POJO中,我想将XML元素名称存储在String变量中,但到目前为止我还没有运气。 MOXy注释@XmlVariableNode非常接近我想要的,但我没有父对象,我不想要一个。我也尝试使用MOXy注释@XmlPath,但似乎MOXy不支持XPath函数name()或local-name()。这是我上一次尝试的一个简单例子:

POJO

public class Data extends DataObject {

    private String source;

    public String getSource() {
        return source;
    }

    @XmlPath("./name()")
    public void setSource(String source) {
        this.source = source;
    }
}

解组:

protected DataObject unmarshallElement(Class<? extends DataObject> marshallingClass) throws JAXBException {
    DataObject retVal = null;

    if(marshallingClass != null) {
        Unmarshaller jaxbUnmarshaller = jaxbUnmarshallerMapping.get(marshallingClass);

        if(jaxbUnmarshaller != null) {
            JAXBElement<? extends DataObject> dataObject = jaxbUnmarshaller.unmarshal(xmlStreamReader, marshallingClass);

            retVal = dataObject.getValue();
        }
        else 
            throw new IllegalArgumentException("No unmarshaller could be found for " + marshallingClass.getName());
    }
    else 
        throw new IllegalArgumentException("No object class was provided");

    return retVal;
}

我确信我可以在下面的unmarshaller中做一些丑陋的事,但我真的不想这样做。

JAXBElement<? extends DataObject> dataObject = jaxbUnmarshaller.unmarshal(xmlStreamReader, marshallingClass);

retVal = dataObject.getValue();

if(dataObject instanceof SomeClass)
    retVal.setSource(dataObject.getName().getLocalPart());

是否可以使用MOXy或JAXB将当前元素名称存储在变量中?

0 个答案:

没有答案