Как найти элемент по значению атрибута в XML через созданный кастором объект - PullRequest
1 голос
/ 01 июня 2011

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

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

1 Ответ

0 голосов
/ 01 июня 2011

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

Не уверен насчет Кастора, но вы можете сделать это достаточно легко с 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>

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

...