Можно ли с помощью MOXy и XPath демонтировать список атрибутов? - PullRequest
3 голосов
/ 02 августа 2011

Редактировать: вот как я загружаю XML-документ, как я использовал его в ответе Блейза. Я загружаю это так, потому что я хочу работать с узлом, а не со всем документом. Даже при использовании всего документа у меня все еще возникают проблемы при загрузке таким способом.

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
factory.setNamespaceAware(false);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("[path to doc]/input.xml");
TestClass testClass = (TestClass) unmarshaller.unmarshal(doc);

У меня есть XML, который выглядит так:

<test>
  <items>
    <item type="cookie">cookie</item>
    <item type="crackers">crackers</item>
  </items>
</test>

А класс:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "test")
public class TestClass
{
  @XmlPath("items/item/text()")
  @XmlElement
  private ArrayList<String> itemList = new ArrayList<String>();

  // getters, setters omitted
}

Приведенный выше код будет работать независимо от того, есть ли у меня @XmlElement, и я получаю ArrayList, содержащий [cookie, crackers].

Если я изменю объявление выше на

@XmlPath("items/item/@type")
@XmlElement
private ArrayList<String> itemList = new ArrayList<String>();

мой ArrayList пуст.

Моя конечная цель - просто иметь атрибуты, чтобы мой XML выглядел так:

<test>
  <items>
    <item type="cookie"/>
    <item type="crackers"/>
  </items>
</test>

Возможно ли то, что я пытаюсь сделать, вытащить список атрибутов с помощью XPath, и если да, то как?

Спасибо.

1 Ответ

2 голосов
/ 02 августа 2011

UPDATE

Я смог подтвердить проблему, которую вы видите (https://bugs.eclipse.org/353763). Исправление добавлено в наши потоки EclipseLink 2.3.1 и 2.4.0 и может быть получено со страницы ночной загрузки начиная с 4 августа, 2011

Обход:

Вы можете обойти эту проблему, настроив DocumentBuilderFactory на поддержку имен:

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(true);
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = builder.parse("src/forum6907225/input.xml");
    testClass = (TestClass) unmarshaller.unmarshal(doc);
    marshaller.marshal(testClass, System.out);
<Ч />

Вы правильно делаете отображение (см. Ниже). Включили ли вы файл jaxb.properties, чтобы указать EclipseLink MOXy в качестве поставщика JAXB?:

Тестовый класс

package forum6907225;

import java.util.ArrayList;

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

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

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "test")
public class TestClass
{
    @XmlPath("items/item/@type")
    @XmlElement
    private ArrayList<String> itemList = new ArrayList<String>();

  // getters, setters omitted
}

Демо

package forum6907225;

import java.io.File;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import org.eclipse.persistence.Version;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(TestClass.class);
        System.out.println(Version.getVersionString());

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum6907225/input.xml");
        TestClass testClass = (TestClass) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(testClass, System.out);
    }

}

Input.xml

<?xml version="1.0" encoding="UTF-8"?>
<test>
  <items>
    <item type="cookie">cookie</item>
    <item type="crackers">crackers</item>
  </items>
</test>

выход

2.3.1.qualifier
<?xml version="1.0" encoding="UTF-8"?>
<test>
   <items>
      <item type="cookie"/>
      <item type="crackers"/>
   </items>
</test>
...