With MOXy and XPath, is it possible to unmarshal a list of attributes?

前端 未结 1 394
别那么骄傲
别那么骄傲 2021-01-20 16:20

Edit: here\'s how I\'m loading the XML document, as I used it in Blaise\'s answer. I\'m loading it like this because I want to work with a node, not the whole doc. Even us

相关标签:
1条回答
  • 2021-01-20 16:57

    UPDATE

    I have been able to confirm the issue you are seeing (https://bugs.eclipse.org/353763). A fix has been added into our EclipseLink 2.3.1 and 2.4.0 streams and can be obtained from the nightly download page starting August 4th, 2011:

    • http://www.eclipse.org/eclipselink/downloads/nightly.php

    Workaround:

    You can workaround this issue by setting your DocumentBuilderFactory to be namespace aware:

        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);
    

    You are doing the mapping correctly (see below). Have you included a jaxb.properties file to specify EclipseLink MOXy as your JAXB provider?:

    • http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html

    Test Class

    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
    }
    

    Demo

    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>
    

    Output

    2.3.1.qualifier
    <?xml version="1.0" encoding="UTF-8"?>
    <test>
       <items>
          <item type="cookie"/>
          <item type="crackers"/>
       </items>
    </test>
    
    0 讨论(0)
提交回复
热议问题