Как найти элемент по значению атрибута в XML с помощью сгенерированного castor объекта

#java #xml #mapping #castor

#java #xml #отображение #castor

Вопрос:

У меня возникли проблемы с поиском элементов по значению атрибута в XML-файле с помощью сгенерированных castor классов.

Castor очень хорошо выполняет сопоставление XML с классами сущностей. Однако он не предоставляет средств для поиска элемента по имени (предположим, что имя является атрибутом элемента). API может найти элемент только по его индексу в списке элементов. На данный момент кажется, что если я хочу найти элемент по имени, мне нужно просмотреть список элементов, чтобы найти его. Поскольку каждый класс, который он отменяет, имеет разные поля, кажется трудным написать универсальный метод для поиска элемента по имени. Есть ли лучший способ найти элемент из списка элементов по имени?

Ответ №1:

Примечание: Я руководитель EclipseLink JAXB (MOXy) и член экспертной группы JAXB (JSR-222).


Не уверен насчет Castor, но вы можете сделать это достаточно просто с помощью EclipseLink JAXB (MOXy).

Клиент

Обратите внимание, как условие [@name='address'] указывается при отображении через @XmlPath аннотацию:

 package blog.predicate;

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement(name="node")
@XmlType(propOrder={"firstName", "lastName", "address", "phoneNumbers"})
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {

    @XmlPath("node[@name='first-name']/text()")
    private String firstName;

    @XmlPath("node[@name='last-name']/text()")
    private String lastName;

    @XmlPath("node[@name='address']")
    private Address address;

    @XmlPath("node[@name='phone-number']")
    private List<PhoneNumber> phoneNumbers;

}
  

XML

 <?xml version="1.0" encoding="UTF-8"?>
<node>
   <node name="first-name">Jane</node>
   <node name="last-name">Doe</node>
   <node name="address">
      <node name="street">123 A Street</node>
   </node>
   <node name="phone-number" type="work">555-1111</node>
   <node name="phone-number" type="cell">555-2222</node>
</node>
  

Для получения дополнительной информации

Комментарии:

1. Спасибо, xmlpath в аннотации выглядит хорошо, но как найти клиента с определенным значением атрибута? В XPath это легко сделать, но в коде Java вам нужно перебрать весь список клиентов, чтобы получить клиента.

2. @newguy — Я не уверен, что понимаю. Я думал, вы хотите сопоставить элемент на основе значения атрибута. Вы ищете что-то другое?

3. Я не ищу сопоставление, потому что castor уже выполняет сопоставление за меня. Я пытаюсь найти способ поиска узла в XML-файле на основе значения атрибута, которое я предоставляю, например, что-то похожее на метод javascript getElementByName (имя строки) или getElementById (идентификатор строки).

4. @newguy — Вы могли бы использовать javax.xml.xpath API в Java SE.