编辑:这是我加载XML文档的方式,正如我在Blaise的回答中使用的那样。我正在加载它,因为我想使用节点,而不是整个doc。即使使用整个文档,我仍然以这种方式加载时遇到了麻烦。
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看起来像这样:
<test>
<items>
<item type="cookie">cookie</item>
<item type="crackers">crackers</item>
</items>
</test>
一堂课:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "test")
public class TestClass
{
@XmlPath("items/item/text()")
@XmlElement
private ArrayList<String> itemList = new ArrayList<String>();
// getters, setters omitted
}
无论我是否@XmlElement
,上面的代码都会有效,我得到一个包含[cookie,crackers]的ArrayList。
如果我将上面的声明更改为
@XmlPath("items/item/@type")
@XmlElement
private ArrayList<String> itemList = new ArrayList<String>();
我的ArrayList为空。
我的最终目标是拥有属性,以便我的XML看起来像这样:
<test>
<items>
<item type="cookie"/>
<item type="crackers"/>
</items>
</test>
我正在尝试做什么,使用XPath提取属性列表,可能,如果是,怎么做?
谢谢。
答案 0 :(得分:2)
<强>更新强>
我能够确认您所看到的问题(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<String> itemList = new ArrayList<String>();
// 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中强>
<?xml version="1.0" encoding="UTF-8"?>
<test>
<items>
<item type="cookie">cookie</item>
<item type="crackers">crackers</item>
</items>
</test>
<强>输出强>
2.3.1.qualifier
<?xml version="1.0" encoding="UTF-8"?>
<test>
<items>
<item type="cookie"/>
<item type="crackers"/>
</items>
</test>