使用MOXy和XPath,是否可以解组属性列表?

编辑:这是我加载XML文档的方式,正如我在Blaise的回答中使用的那样。 我正在加载它,因为我想使用节点,而不是整个文档。 即使使用整个文档,我在以这种方式加载时仍然遇到麻烦。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(false); factory.setNamespaceAware(false); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse("[path to doc]/input.xml"); TestClass testClass = (TestClass) unmarshaller.unmarshal(doc); 

我有这样的XML:

   cookie crackers   

一堂课:

 @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "test") public class TestClass { @XmlPath("items/item/text()") @XmlElement private ArrayList itemList = new ArrayList(); // getters, setters omitted } 

无论我是否有@XmlElement ,上面的代码都会起作用,我得到一个包含[cookie,crackers]的ArrayList。

如果我将上面的声明更改为

 @XmlPath("items/item/@type") @XmlElement private ArrayList itemList = new ArrayList(); 

我的ArrayList是空的。

我的最终目标是拥有属性,所以我的XML看起来像这样:

       

我正在尝试做什么,使用XPath提取属性列表,可能,如果是,如何?

谢谢。

UPDATE

我已经能够确认您所看到的问题( https://bugs.eclipse.org/353763 )。 我们的EclipseLink 2.3.1和2.4.0流中添加了一个修复程序,可以从2011年8月4日开始的每晚下载页面获得:

解决方法:

您可以通过将DocumentBuilderFactory设置为名称空间来解决此问题:

  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse("src/forum6907225/input.xml"); testClass = (TestClass) unmarshaller.unmarshal(doc); marshaller.marshal(testClass, System.out); 

您正在进行正确的映射(见下文)。 您是否包含了一个jaxb.properties文件来指定EclipseLink MOXy作为您的JAXB提供程序?:

测试类

 package forum6907225; import java.util.ArrayList; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import org.eclipse.persistence.oxm.annotations.XmlPath; @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "test") public class TestClass { @XmlPath("items/item/@type") @XmlElement private ArrayList itemList = new ArrayList(); // getters, setters omitted } 

演示

 package forum6907225; import java.io.File; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import org.eclipse.persistence.Version; public class Demo { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(TestClass.class); System.out.println(Version.getVersionString()); Unmarshaller unmarshaller = jc.createUnmarshaller(); File xml = new File("src/forum6907225/input.xml"); TestClass testClass = (TestClass) unmarshaller.unmarshal(xml); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(testClass, System.out); } } 

input.xml中

    cookie crackers   

产量

 2.3.1.qualifier