Ayrıştırmam gereken bir XML akışı var. Sadece bir kez yapmam ve java nesnelerini yapmam gerektiğinden, SAX doğal tercih gibi görünüyor. DefaultHandler'ı genişletiyorum ve startElement, endElement ve karakter yöntemlerini uygulayarak, mevcut okuma değerini kaydettiğim (karakter yönteminde alınmış) sınıfımdaki üyelerim var.Java SAX Ayrıştırma
İhtiyacım olanı yapmaya çalışırken sorunum yok, ancak kodum oldukça karmaşık ve eminim bunun için bir neden yok ve işleri farklı yapabilirim. Aynı etiket adları dosyanın çeşitli alanlarda kullanıldığını fark edince Benim sorunum başladı
<players>
<player>
<id></id>
<name></name>
<teams total="2">
<team>
<id></id>
<name></name>
<start-date>
<year>2009</year>
<month>9</month>
</start-date>
<is-current>true</is-current>
</team>
<team>
<id></id>
<name></name>
<start-date>
<year>2007</year>
<month>11</month>
</start-date>
<end-date>
<year>2009</year>
<month>7</month>
</end-date>
</team>
</teams>
</player>
</players>
: benim XML yapısı böyle bir şeydir. Örneğin, hem oyuncu hem de takım için id ve isim vardır. Java sınıfları Oyuncu ve Takımımın örneklerini oluşturmak istiyorum. Ayrıştırma yaparken boolean bayraklarını ekipler bölümünde olduğumu söyleyerek tuttum. Bu yüzden, endElement'te ismin bir takımın ismi olduğunu, oyuncunun adını ve benzeri olmadığını bileceğim. gibi benim kod nasıl göründüğünü
İşte: Ben takımlara ek olarak bir oyuncuya daha fazla düğüm var ve bu düğümler de adı ve kimliği gibi etiketine sahip benim gerçek senaryoda yana
public class MyParser extends DefaultHandler {
private String currentValue;
private boolean inTeamsSection = false;
private Player player;
private Team team;
private List<Team> teams;
public void characters(char[] ch, int start, int length) throws SAXException {
currentValue = new String(ch, start, length);
}
public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
if(name.equals("player")){
player = new Player();
}
if (name.equals("teams")) {
inTeamsSection = true;
teams = new ArrayList<Team>();
}
if (name.equals("team")){
team = new Team();
}
}
public void endElement(String uri, String localName, String name) throws SAXException {
if (name.equals("id")) {
if(inTeamsSection){
team.setId(currentValue);
}
else{
player.setId(currentValue);
}
}
if (name.equals("name")){
if(inTeamsSection){
team.setName(currentValue);
}
else{
player.setName(currentValue);
}
}
if (name.equals("team")){
teams.add(team);
}
if (name.equals("teams")){
player.setTeams(teams);
inTeamsSection = false;
}
}
}
, kendimi berbat bulundu inTeamsSection'a benzeyen birkaç boole ile birlikte ve endElement yöntemim birçok koşulla uzun ve karmaşık hale gelir.
Farklı ne yapmalıyım? Örneğin bir isim etiketinin neye ait olduğunu nasıl bilebilirim?
Teşekkürler!
SAX kullanmanın 7 yıl önce doğal bir seçim olduğunu söyleyebilirim. Şu anda doğal seçim JAXB (veya Xtream veya XmlBeans veya JibX) – Tarlog
kullanmaktır. Bazen sadece el ile ayrıştırma yapmak zorunda. XML nesnelerini XML nesnelerine dönüştürdüğünüzde, bu çok iyi bir fikir değildir. –
@ ʘleg - Bir StAX XMLStreamReader'dan marjinal olmayan nesnelere JAXB kullanırsanız, bellek kısıtlamalarını yönetmek için daha büyük bir belgenin alt sınırlarını kaldırabilirsiniz. –