jxpath 不尊重 xjc 生成的 JAXB 的 XmlElement 名称 类
jxpath not honoring JAXB's XmlElement name of xjc-generated classes
我使用 XML 架构定义和 JAXB 生成具有适当 @XmlElement
或 @XmlRootElement
注释的 Java classes。
由于架构中有一些深层嵌套(不是我的选择),我宁愿使用 jxpath
通过 XPath(而不是繁琐的菊花链)访问深埋的 classes .getThat()
和 that != null
).
问题是某些 XML 元素名称包含破折号,例如foo-bar
。当我尝试使用 org.apache.jxpath
访问元素时,我需要重写我的 XPath,以便将这些名称改为驼峰式 (fooBar
),就像实际 Java 对象的名称一样。有什么方法可以告诉 jxpath
使用对应于 XML 元素名称(而不是驼峰式 Bean 名称)的 XPath 查找元素?
我认为它与this question有关,但就我而言,我实际上并没有在自动生成的class上使用什么样的技巧和装饰,只要xjc 可以做到。
这里有一个简单的例子来说明这个问题。
首先,一个小的XSD文件:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="record">
<xs:complexType>
<xs:sequence>
<xs:element name="foo-bar" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
编译它...
xjc -p org.pd.jx example.xsd
这是 xjc 生成的 Record.java
class(减去注释):
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {"fooBar"})
@XmlRootElement(name = "record")
public class Record {
@XmlElement(name = "foo-bar", required = true)
protected String fooBar;
public String getFooBar() {return fooBar;}
public void setFooBar(String value) {this.fooBar = value;}
}
然后,尝试通过 jxpath
访问数据(实际上我必须处理很多深度嵌套的 classes),可以在下面看到正确的 XPath ("foo-bar"
) 不起作用,但驼峰式版本可以。
Record record = new Record();
record.setFooBar("hello world");
JXPathContext context = JXPathContext.newContext(record);
context.setLenient(true);
String a = (String)context.getValue("foo-bar", String.class); // is null
String b = (String)context.getValue("fooBar", String.class); // "hello world"
我相信 JXPath 对对象属性而不是它们对应的 XML 元素进行操作。我不相信 JXPath 会解析任何 JAXB 元数据,因此它不会知道您映射的 XML 节点。您所看到的似乎是预期的行为。
我使用 XML 架构定义和 JAXB 生成具有适当 @XmlElement
或 @XmlRootElement
注释的 Java classes。
由于架构中有一些深层嵌套(不是我的选择),我宁愿使用 jxpath
通过 XPath(而不是繁琐的菊花链)访问深埋的 classes .getThat()
和 that != null
).
问题是某些 XML 元素名称包含破折号,例如foo-bar
。当我尝试使用 org.apache.jxpath
访问元素时,我需要重写我的 XPath,以便将这些名称改为驼峰式 (fooBar
),就像实际 Java 对象的名称一样。有什么方法可以告诉 jxpath
使用对应于 XML 元素名称(而不是驼峰式 Bean 名称)的 XPath 查找元素?
我认为它与this question有关,但就我而言,我实际上并没有在自动生成的class上使用什么样的技巧和装饰,只要xjc 可以做到。
这里有一个简单的例子来说明这个问题。
首先,一个小的XSD文件:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="record">
<xs:complexType>
<xs:sequence>
<xs:element name="foo-bar" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
编译它...
xjc -p org.pd.jx example.xsd
这是 xjc 生成的 Record.java
class(减去注释):
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {"fooBar"})
@XmlRootElement(name = "record")
public class Record {
@XmlElement(name = "foo-bar", required = true)
protected String fooBar;
public String getFooBar() {return fooBar;}
public void setFooBar(String value) {this.fooBar = value;}
}
然后,尝试通过 jxpath
访问数据(实际上我必须处理很多深度嵌套的 classes),可以在下面看到正确的 XPath ("foo-bar"
) 不起作用,但驼峰式版本可以。
Record record = new Record();
record.setFooBar("hello world");
JXPathContext context = JXPathContext.newContext(record);
context.setLenient(true);
String a = (String)context.getValue("foo-bar", String.class); // is null
String b = (String)context.getValue("fooBar", String.class); // "hello world"
我相信 JXPath 对对象属性而不是它们对应的 XML 元素进行操作。我不相信 JXPath 会解析任何 JAXB 元数据,因此它不会知道您映射的 XML 节点。您所看到的似乎是预期的行为。