所以,我回答你的另一个问题。我有一个JAXB对象,我从XML文件编组/解组。
代码如下:
@XmlAccessorType(XmlAccessType.FIELD)
public class Line {
@XmlElement(required = true)
@Min(1)
private int quantity;
...
}
我的XML结构是:
<line>
<quantity>2</quantity>
</line>
现在Java代码也接受了这个:
<line>
<quantity>2</quantity>
<quantity>2</quantity>
</line>
那么,我应该如何编程我的约束,我只接受第一个xml而不是第二个。
再次感谢!
答案 0 :(得分:3)
您应该使用XSD并根据它验证您的xml。 我们必须使用与其版本对应的xsd验证我们的xml文件:
ValidationEventCollector vec = new ValidationEventCollector();
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
URL xsdURL = getClass().getResource("/xsd/" + xsd);
Schema schema = sf.newSchema(xsdURL);
//You should change your jaxbContext here for your stuff....
Unmarshaller um = (getJAXBContext(NotificationReponseEnum.NOTIFICATION, notificationWrapper.getEnteteNotification().getTypeNotification()))
.createUnmarshaller();
um.setSchema(schema);
try {
StringReader reader = new StringReader(xml);
um.setEventHandler(vec);
um.unmarshal(reader);
} catch (javax.xml.bind.UnmarshalException ex) {
if (vec != null && vec.hasEvents()) {
erreurs = new ArrayList<MessageErreur>();
for (ValidationEvent ve : vec.getEvents()) {
MessageErreur erreur = new MessageErreur();
String msg = ve.getMessage();
ValidationEventLocator vel = ve.getLocator();
int numLigne = vel.getLineNumber();
int numColonne = vel.getColumnNumber();
erreur.setMessage(msg);
msgErreur.setCode(ve.getSeverity())
erreur.setException(ve.getLinkedException());
erreur.setPosition(numLigne, numColonne);
erreurs.add(erreur);
logger.debug("Erreur de validation xml" + "erreur : " + numLigne + "." + numColonne + ": " + msg);
}
}
}