JAXB unmarshal z zadeklarowanym typem nie zapełnia wynikowego obiektu danymi
Próbuję unieważnić dany 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>
Schemat został już skompilowany do klas JAXB, zobacz tutaj:
@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
*/
.....
}
Mój kod unieważniający XML jest następujący:
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: Wynikowy obiekt FHcomment nie zawiera elementów potomnych FHcomment. Wszystkie są zerowe, co nie jest pożądanym wynikiem.
Jak mogę powiedzieć JAXB, aby całkowicie unieważnił dany XML w obiekcie?
EDYTOWAĆ: Po dodaniu ValidationHandler do Unmsarshallera zbliżyłem się do problemu:
nieoczekiwany element (uri: „”, local: „TX”). Oczekiwane elementy to <{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} rozszerzenia>, <{htp: //www.example.com/mdf/v4} tool_vendor>, <{htp: //www.example.com/mdf/v4} nazwa_użytkownika>
nieoczekiwany element (uri: „”, local: „tool_id”). Oczekiwane elementy to ....
Okazuje się, że JAXB nie podoba się faktowi, że dostarczony XML nie zawiera informacji o przestrzeni nazw. Jak więc mogę powiedzieć unmarshallerowi, aby zignorował przestrzenie nazw?
EDIT2:
Po kilku dalszych badaniach nie udało mi się znaleźć sposobu na oszukanie JAXB do pracy bez weryfikacji przestrzeni nazw. Użyłem samouczka na stroniehttp://cooljavablogs.blogspot.de/2008/08/how-to-instruct-jaxb-to-ignore.html ominąć mój problem. Nie jest to miłe rozwiązanie, ale najlepsze pod ręką ...