JAXB without a marshal with a declared type does not populate the resulting object with data

I am trying to unmount this XML:

<FHcomment> <TX>rewriting of file</TX> <tool_id>toolA</tool_id> <tool_vendor>Company</tool_vendor> <tool_version>1.7.36.0</tool_version> </FHcomment> 

The schema has already been compiled into JAXB classes, see here:

 @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "tx", "toolId", "toolVendor", "toolVersion", "userName", "commonProperties", "extensions" }) @XmlRootElement(name = "FHcomment") public class FHcomment { @XmlElement(name = "TX", required = true) protected TX tx; @XmlElement(name = "tool_id", required = true) protected BaseName toolId; @XmlElement(name = "tool_vendor", required = true) protected BaseName toolVendor; @XmlElement(name = "tool_version", required = true) protected BaseVersion toolVersion; @XmlElement(name = "user_name") protected BaseName userName; @XmlElement(name = "common_properties") protected CommonPropertiesType commonProperties; protected ExtensionsType extensions; @XmlAnyAttribute private Map<QName, String> otherAttributes = new HashMap<QName, String>(); ..... /* * GETTERS and SETTERS for the fields have been removed here */ ..... } 

My XML decoupling code is as follows:

 JAXBContext jc = JAXBContext.newInstance(FHcomment.class); String s = "<FHcomment>....</Fhcomment>"; Unmarshaller unmarshaller = jc.createUnmarshaller(); XMLInputFactory fac = XMLInputFactory.newFactory(); XMLStreamReader xsr = fac.createXMLStreamReader(new StringReader(s)); JAXBElement<FHcomment> foo = unmarshaller.unmarshal(xsr, FHcomment.class); FHcomment val = foo.getValue(); 

Problem: The resulting FHcomment object does not contain FHcomment children. All are null, which is not the desired result.

How can I tell JAXB to completely untie a given XML into an object?

EDIT: By adding ValidationHandler to Unmsarshaller, I got closer to the problem:

unexpected element (uri: ", local:" TX "). Expected elements: <{htp: //www.example.com/mdf/v4} tool_id>, <{htp: //www.example.com/mdf/ v4} TX>, <{htp: //www.www.example.com/mdf/v4} common_properties>, <{htp: //www.example.com/mdf/v4} tool_version>, <{htp: / /www.example.com/mdf/v4} extensions>, <{OEM: //www.www.example.com/mdf/v4} tool_vendor>, <{HTP: //www.www.example.com/mdf / v4} username>

unexpected element (uri: ", local:" tool_id "). Expected elements: ....

Turns out JAXB doesn't like the fact that the XML provided does not contain namespace information. So how can I tell unmarshaller to ignore namespaces?

EDIT2:

After some more research, I couldn't find a way to trick JAXB into working without checking the namespace. I used the tutorial at http://cooljavablogs.blogspot.de/2008/08/how-to-instruct-jaxb-to-ignore.html to get around my problem. Bad decision, but the best at hand ...

+2
source share
4 answers

Your XML document does not match the namespace qualification that was defined in your mappings (see http://blog.bdoughan.com/2010/08/jaxb-namespaces.html ). You could use XMLFilter to apply a namespace to your XML document during an unmarshal operation.

 import org.xml.sax.*; import org.xml.sax.helpers.XMLFilterImpl; public class NamespaceFilter extends XMLFilterImpl { private static final String NAMESPACE = "htp://www.example.com/mdf/v4"; @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(NAMESPACE, localName, qName); } @Override public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { super.startElement(NAMESPACE, localName, qName, atts); } } 

The following is an example of how you will use XMLFilter during a non- XMLFilter .

  // Create the XMLFilter XMLFilter filter = new NamespaceFilter(); // Set the parent XMLReader on the XMLFilter SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); XMLReader xr = sp.getXMLReader(); filter.setParent(xr); // Set UnmarshallerHandler as ContentHandler on XMLFilter Unmarshaller unmarshaller = jc.createUnmarshaller(); UnmarshallerHandler unmarshallerHandler = unmarshaller .getUnmarshallerHandler(); filter.setContentHandler(unmarshallerHandler); // Parse the XML InputSource xml = new InputSource("input.xml"); filter.parse(xml); Object result = unmarshallerHandler.getResult(); 

Additional Information

+3
source

Change BaseName and TX to String and it will work. Since this xml does not match your schema, which in this case is represented by a class.

0
source

Try to remove the following code and try again:

  @XmlType(name = "", propOrder = { "tx", "toolId", "toolVendor", "toolVersion", "userName", "commonProperties", "extensions" }) 
0
source

How did you annotate the BaseName, BaseVersion, and TX classes?

If you did not annotate these classes, you annotate the string inside these classes as @XmlValue

0
source

Source: https://habr.com/ru/post/1488279/


All Articles