2015-03-15 7 views
1

Я использую определение схемы 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" 

ответ

1

Я считаю, что JXPath работает с объектами, а не с элементами XML, которым они соответствуют. Я не считаю, что JXPath анализирует любую из метаданных JAXB, поэтому он не будет знать XML-узел, который вы сопоставили. То, что вы видите, похоже, является ожидаемым поведением.

+0

Спасибо @BlaiseDoughan. Вот что я боялся ... Ах, хорошо. Поскольку для этих классов я в удобстве, я быстро переписал XPath, чтобы перевести его в форму на основе класса (например, верблюжьей). –