我正在使用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将当前元素名称存储在变量中?