La racine de mon problème est un XML donné avec des noms de nœuds variables. Le code XML est déjà utilisé et ne peut pas être modifié.JAXB change l'élément "nom" de l'annotation @XMLElements
J'ai créé un XSD pour le XML afin de générer les classes corrospondantes, puis de l'analyser via un DOMParser.
J'utilise le DOMParser parce que par JAXB il n'est pas analysable à cause des noms de variables mais les classes générées sont utiles.
Maintenant, j'ai juste besoin d'un identifiant pour la variable Nodes dans les classes. J'ai pensé qu'il serait préférable de simplement changer l'élément @XmlElement Annotations "name" et lui donner une valeur comme "?" pour identifier les noeuds variables, mais je n'ai aucune idée si et comment il peut être possible de le changer.
J'ai déjà créé un fichier d'épisode pour changer certains noms de classe et je pensais que cela pouvait être changé, mais je n'ai pas trouvé de solution pour cela.
Exemple XML:
<Settings>
<Window>
<Position Top="5" Left="5"/>
</Window>
<OpenData>
<variable>
<TableData>
<variable-column00 POS="1" Visible="true" SortDesc="true"/>
<variable-column01 POS="3" Visible="true" SortDesc="true"/>
<variable-column02 POS="2" Visible="true" SortDesc="true"/>
</TableData>
</variable>
<variable>
<UserSettings>
<variable-series1 Color="blue" Caption="Series blue" Visible="true" />
<variable-series2 Color="yellow" Caption="Series yellow" Visible="true" />
<variable-series3 Color="red" Caption="Series red" Visible="true" />
</UserSettings>
<ChartConfig>configuration-json....</ChartConfig>
</variable>
<variable/>
</OpenData>
</Settings>
Les nœuds variables seraient: noeuds avec le nom "variable", en commençant noeuds avec "colonne variable" et un certain nombre (sous-noeuds de table de données) et les noeuds commençant par « variable série » et un certain nombre (sous-noeuds de paramètres utilisateur)
le XSD pour ce serait:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:complexType name="Window">
<xs:complexContent>
<xs:extension base="SettingsElement">
<xs:sequence>
<xs:element name="Position" type="Position" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Position">
<xs:complexContent>
<xs:extension base="SettingsElement">
<xs:attribute name="Top" type="xs:int" />
<xs:attribute name="Left" type="xs:int" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="OpenData">
<xs:complexContent>
<xs:extension base="SettingsElement">
<xs:sequence>
<!-- this would be the "variable" Node -->
<xs:element name="View" type="View" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="View">
<xs:complexContent>
<xs:extension base="SettingsElement">
<xs:sequence>
<!-- normaly the order would be random, but because i use the DOMParser i don't need to pass that to JAXB -->
<xs:element name="TableData" type="TableData" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="UserSettings" type="UserSettings" minOccurs="0" maxOccurs="1" />
<xs:element name="ChartConfig" type="xs:string" minOccurs="0" maxOccurs="1" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="UserSettings">
<xs:complexContent>
<xs:extension base="SettingsElement">
<xs:sequence>
<!-- the next Variable Node name beginning with "variable-series" and then a number -->
<xs:element name="SeriesDefinition" type="SeriesDefinition" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="SeriesDefinition">
<xs:complexContent>
<xs:extension base="SettingsElement">
<xs:attribute name="Color" type="xs:string" />
<xs:attribute name="Caption" type="xs:string" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="TableData">
<xs:complexContent>
<xs:extension base="SettingsElement">
<xs:sequence>
<!-- the next Variable Node name beginning with "variable-column" and then a number -->
<xs:element name="Column" type="Column" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Column">
<xs:complexContent>
<xs:extension base="SettingsElement">
<xs:attribute name="POS" type="xs:int" />
<xs:attribute name="Visible" type="xs:boolean" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="SettingsElement">
</xs:element>
<xs:element name="Settings" >
<xs:complexType>
<xs:sequence>
<xs:element name="Window" type="Window" minOccurs="0" />
<xs:element name="OpenData" type="OpenData" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
et après je générer i C lass OpenData avec liste de vue serait:
import java.io.Serializable;
import java.util.ArrayList;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "OpenData", propOrder = {
"view"
})
public class OpenData extends SettingsElement implements Serializable {
private final static long serialVersionUID = 1L;
@XmlElement(name = "View")
protected java.util.List<View> view;
public java.util.List<View> getview() {
if (view == null) {
view = new ArrayList<View>();
}
return this.view;
}
}
je besoin d'un identifiant pour mon analyse syntaxique au travail et donc quelque chose comme changer l'Annotation
@XmlElement(name = "View")
à
@XmlElement(name = "?")
Alors Je sais que le nom de tag que je recherche n'est pas View mais pourrait être n'importe quoi.
Merci pour l'aide à l'avance.
Bienvenue dans StackOverflow! Veuillez consulter les [guides pour poser des questions] (https://stackoverflow.com/help/asking), en particulier [comment créer un exemple minimal, complet et vérifiable] (https://stackoverflow.com/help/mcve) – AesSedai101