Я использую определение схемы XML и JAXB для генерации классов Java с соответствующими аннотациями @XmlElement
или @XmlRootElement
.jxpath не соблюдает имя XmlElement JAXB для xjc-генерируемых классов
Поскольку схема имеет некоторые глубокую вложенность в нем (не моем выборе), я предпочел бы использовать jxpath
для доступа глубоко зарытых классов с использованием XPath (а не громоздкая гирляндой из .getThat()
и that != null
).
Проблема в том, что некоторые имена элементов XML содержат тире, например. foo-bar
. Когда я пытаюсь получить доступ к элементам с помощью org.apache.jxpath
, мне нужно переписать мой XPath так, чтобы вместо этого имена были заменены на верблюд (fooBar
), как имя реальных объектов Java. Есть ли способ сообщить jxpath
, чтобы найти элементы, используя XPath, соответствующие именам XML-элементов (вместо имен Bean на основе верблюда)?
Я думаю, что это связано с this question, однако в моем случае я на самом деле не делаю, какие трюки и украшения используются на автоматически сгенерированных классах, если 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
класс (минус комментарии):
@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
(на практике мне приходится иметь дело с большим количеством вложенные классы), ниже видно, что правильный 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"
Спасибо @BlaiseDoughan. Вот что я боялся ... Ах, хорошо. Поскольку для этих классов я в удобстве, я быстро переписал XPath, чтобы перевести его в форму на основе класса (например, верблюжьей). –