Vous pouvez exécuter une instruction get sur des données qui ont été définies dans un champ de la même manière que pour une autre valeur d'élément si le nom est connu.
Vous pouvez envoyer une instruction get avec la balise XPath "<name>" pour la résoudre. Si le nom est inconnu, il est possible de trouver la valeur en vérifiant les propriétés de l'instance comme ci-dessus. S'il y a plusieurs balises any, ou une balise any avec maxOccurs > 1, la séquence de l'objet de données devra être utilisée à la place s'il est important de déterminer quelle balise any est à l'origine des données.
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://AnyElemAny" targetNamespace="http://AnyElemAny"> <xsd:complexType name="AnyElemAny"> <xsd:sequence> <!-- Handle all these any one way --> <xsd:any maxOccurs="3"/> <xsd:element name="marker1" type="xsd:string"/> <!-- Handle this any in another --> <xsd:any/> </xsd:sequence> </xsd:complexType> </xsd:schema>
La balise <any/> entraînant la mise en séquence de l'objet de données, il est possible de déterminer quelle valeur any a été définie en vérifiant dans la séquence la position des propriétés any.
Vous pouvez déterminer à quelle balise any les données d'instance appartiennent pour le XSD suivant en utilisant le code suivant :
DataObject anyElemAny = ... Seqeuence seq = anyElemAny.getSequence(); // Jusqu'à ce que l'élément marker1 ait été trouvé, toutes les données ouvertes // trouvées appartiennent à la première balise any boolean foundMarker1 = false; for (int i=0; i<seq.size(); i++) { Property prop = seq.getProperty(i); // Vérifiez si la propriété est une propriété ouverte si (prop.isOpenContent()) { si (!foundMarker1) { // Doit être la première balise any car elle survient // avant l'élément marker1 System.out.println("Found first any data: "+seq.getValue(i)); } else { // Doit être la seconde balise any car elle survient // après l'élément marker1 System.out.println("Found second any data: "+seq.getValue(i)); } } else { // Doit être l'élément marker1 System.out.println("Found marker1 data: "+seq.getValue(i)); foundMarker1 = true; } }
Définir une valeur <any/> est effectué en créant une propriété d'élément global et en ajoutant cette valeur à la séquence.
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://GlobalElems" targetNamespace="http://GlobalElems"> <xsd:element name="globalElement1" type="xsd:string"/> <xsd:element name="globalElement2" type="xsd:string"/> </xsd:schema> DataObject anyElemAny = ... Seqeuence seq = anyElemAny.getSequence(); // Obtenir la propriété de l'élement global pour globalElement1 Property globalProp1 = boXsdHelper.getGlobalProperty(http://GlobalElems, "globalElement1", true); // Obtenir la propriété de l'élément global pour globalElement2 Property globalProp2 = boXsdHelper.getGlobalProperty(http://GlobalElems, "globalElement2", true); // Ajouter les données à la séquence pour la première balise any seq.add(globalProp1, "foo"); seq.add(globalProp1, "bar"); // Ajouter les données pour le marker1 seq.add("marker1", "separator"); // ou anyElemAny.set("marker1", "separator") // Ajouter les données à la séquence pour la seconde balise any seq.add(globalProp2, "baz"); // Il est maintenant possible d'accéder aux données avec une instruction get System.out.println(dobj.get("globalElement1"); // Affiche "[foo, bar]" System.out.println(dobj.get("marker1"); // Affiche "separator" System.out.println(dobj.get("globalElement2"); // Affiche "baz"