项目中用到XMLBeans做XML的数据绑定工作,但是发现生成的代码中的selectPath并不工作,调查后发现要使用SAXON,但是下载最新版后发现仍然不能正常工作.又经过调查得以解决.
XMLBeans2.2版是和saxon的8.6.1版一起工作的。最初的8.7和GOOGLE到的解决方案中为2.0版准备的8.1都不行
XMLBeans2.2:
http://mirror.vmmatrix.net/apache/xmlbeans/binaries/
saxon 8.6.1:
http://jaist.dl.sourceforge.net/sourceforge/saxon/saxonb8-6-1.zip
xpath查询至少需要 saxon8.jar saxon8-dom.jar saxon8-xpath.jar才能正常工作
缺少saxon8.jar会报如下错误
java.lang.RuntimeException: Trying XBeans path engine... Trying XQRL... Trying Saxon... FAILED on $this/data[@name='data2']
at org.apache.xmlbeans.impl.store.Path.getCompiledPath(Path.java:131)
at org.apache.xmlbeans.impl.store.Path.getCompiledPath(Path.java:91)
at org.apache.xmlbeans.impl.store.Cursor._selectPath(Cursor.java:902)
at org.apache.xmlbeans.impl.store.Cursor.selectPath(Cursor.java:2634)
at org.apache.xmlbeans.impl.values.XmlObjectBase.selectPath(XmlObjectBase.java:431)
at org.apache.xmlbeans.impl.values.XmlObjectBase.selectPath(XmlObjectBase.java:415)
at test.main(test.java:16)
Exception in thread "main"
只放saxon8.jar也是不正确的.缺少其他2个jar查询结果会不正确
简单测试:
SCHEMA:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="root" type="rootType">
<xs:annotation>
<xs:documentation>rootcomment</xs:documentation>
</xs:annotation>
</xs:element>
<xs:complexType name="dataType">
<xs:attribute name="name" use="required"/>
</xs:complexType>
<xs:complexType name="datasType">
<xs:sequence>
<xs:element name="data" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="rootType">
<xs:sequence>
<xs:element name="datas" type="datasType"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
XML:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Z:\test.xsd">
<datas>
<data name="data1">value1</data>
<data name="data2">value2</data>
<data name="data3">value3</data>
</datas>
</root>
jest.java
import java.io.File;
import noNamespace.DatasType;
import noNamespace.RootDocument;
import org.apache.xmlbeans.XmlObject;
public class test {
final static String NS_DECLEAR = "";
public static void main(String[] args) throws Exception {
RootDocument doc = RootDocument.Factory.parse(new File("z:\\test.xml"));
DatasType datas = doc.getRoot().getDatas();
XmlObject[] objs = datas.selectPath("$this/data[@name='data2']");
for (int i = 0; i < objs.length; i++) {
System.out.println(objs[i]);
}
}
}
输出:
<xml-fragment name="data2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">value2</xml-fragment>