# XML - mal wieder.



## phipsnet (2. Mai 2005)

moin allerseits;
folgendes problem habe ich:
gegeben ist eine xml struktur dieser art: 


```
<text>
   <page nummer="1"/>
   <variation>
             <variant idVar="München 34">Ditze bvch haeizet div chlage</variant>
             <variant idVar="Wien">Ditz puech haysset klagen</variant>
             <variant idVar="Donaueschingen 63">Aventiure von der Klage</variant>
             <variant idVar="Donaueschingen 64">Aventiure von der Klage</variant>
             <variant idVar="Berlin 855">Hie hebt sich die austragung vnd die clag</variant>
        </variation>
        der doten
        <line/>
        <mode idMode="Initiale">H</mode>ie
   <variation>
             <variant idVar="München 34">hevet</variant>
             <variant idVar="" ></variant>
         sich
             <variant idVar="München 31">an</variant>
             <variant idVar="Nürnberg">an </variant>
        <variant idVar="Krakau">an </variant>
        <variant idVar="Prag">an </variant>
        <variant idVar="Berlin 855">an </variant>
        <variant idVar="Wien">das</variant>
   </variation>
</text>
```

jetzt soll ich mit meinem parser einen string der folgenden art zusammenbasteln:
auf anfrage einer methode, die eine idVar mitschickt (zb. 'muenchen 34') soll ich folgendes zurueckgeben:

"Ditze bvch haeizet div chlage
hevet sich"

ich muss also den content in <text> aufbroeseln und ggfls. noch strings dazwischenpacken. mir haengt sich dabei gerade der kopf aus. zurureckgeben soll ich einen string. hat jemand eine idee, wie ich das machen koennte ? falls garnichts mehr hilft, koennte man auch noch die xml struktur dahingehend aendern, dass man dem content in <text> eigene tags mitgibt, aber das sollte die letzte option sein (...selbst dann wuesste ich nicht, wie es gehen koennte...argh!) 

weiterbringende tips und ratschlaege sind sehr willkommen!  

1000dank im vorraus


----------



## stev.glasow (2. Mai 2005)

Wo liegt denn konkret das Probelm, den content sollte eigentlich jeder gängige xml Parser auslesen können.


----------



## phipsnet (2. Mai 2005)

wenn du dir den string ansiehst, den ich zurueckgeben muss, ist das ein mix aus dem content von <text>
und dem text des jeweiligen <variant> tags; in dem fall 'münchen 34';

also folgendermaßen:
[content <text>] + [content <variant>] + [content <text>] + [content <variant>]

...und da weiss ich eben nicht, wie ich den content von <text> aufbroeseln kann...


----------



## stev.glasow (2. Mai 2005)

Mit welchem Parser arbeitest du? Mit JDOM und Co geht das doch recht gut. Normaler weise holst du dir einfach die Inhalte als String und addierst diese. Oder verstehe ich dich miss? Willst du nen eigenen Parser schreiben?


----------



## phipsnet (2. Mai 2005)

ja, mit jdom. wenn ich mir mit text.getText() den content geben lasse, bekomme ich
"der doten sich" zurueck.

nun soll aber mein ergebnisstring
"Ditze bvch haeizet div chlage der doten hevet sich"
heissen. das bedeutet, ich muss den conten von <text> splitten, weill ich
zwischen zwei strings etwas einfuegen muss...


----------



## stev.glasow (2. Mai 2005)

Tut mir Leid  ich verstehe nicht wo das Problem liegt  :? 
Vielleicht weiß ja jemand anderes was.
Oder wir versuchen noch einen dritten Erklärungsversuch.

Du gehst die Varianaten durch vergleichstet deren idVars auf "München 34" und addierst bei übereinstimmung die Inhalte.


----------



## phipsnet (2. Mai 2005)

ok, also nochmal:

wenn du dir den ergebnisstring ansiehst, stellst du fest, dass dieser nicht nur aus content von <variant> besteht, sondern ein mix aus content von <text> und <variant> ist. jetzt klar ?

und das problem besteht darin, den string korrekt zusammenzusetzen.  schau dir das xml mal genau an und vor allem den ergebnisstring, dann sollte das problem klar werden...


----------



## clemson (2. Mai 2005)

also, wenn ich dich richtig verstanden habe, dann willst du die inhalte aller variant-elemente, welche die varId="München 34" haben, richtig?

kleine frage:

warum willst du, dass dabei dann auch der string "sich" zurückgegeben wird?? "sich" ist (laut deinem beispiel) gar kein text von einem variation elemenet mit der varId="München 34"


----------



## stev.glasow (2. Mai 2005)

Schau dir das mal an:



```
private static final SAXBuilder sb = new SAXBuilder();
	
	public static String blub(String key, InputStream in) throws JDOMException, IOException{
		StringBuffer buf = new StringBuffer();
		Document doc = sb.build(in); 
		Element root = doc.getRootElement();
		
		Iterator i = root.getContent().iterator();
		while(i.hasNext()){
			
			Object e = i.next();
			if(e instanceof Element){
				Element vs = (Element)e;
				if(!vs.getName().equals("variation")) continue;
				
				Iterator ii = vs.getContent().iterator();
				while(ii.hasNext()){
					e = ii.next();
					if(e instanceof Element){
						Element v = (Element)e;
						if(!v.getName().equals("variant")) continue;
					
						Attribute idVar = v.getAttribute("idVar"); 
						if(idVar != null && idVar.getValue().equals(key)){
							buf.append(' ');
							buf.append(v.getText());
						}
					
					}
					else if(e instanceof Text){						
						String txt = ((Text)e).getTextTrim();
						if(txt.length() > 0){
							buf.append(' ');
							buf.append(txt);
						}
					}
				}
			}
			else if(e instanceof Text){				
				String txt = ((Text)e).getTextTrim();
				if(txt.length() > 0){
					buf.append(' ');
					buf.append(txt);
				}
			}
		}
		return buf.toString().trim();
		
	}
	
	public static void main(String[] args) throws IOException, JDOMException{
		
		System.out.println(blub("München 34", new FileInputStream("text.xml")));
	}
```
Ausgabe: Ditze bvch haeizet div chlage der doten ie hevet sich


----------



## phipsnet (2. Mai 2005)

du bist nicht zufaellig mit dem projekt betraut ?
anyways...vielen lieben dank; ich werde den ansatz gleich mal testen..

so long.
.p


----------



## phipsnet (3. Mai 2005)

hallo,

nochmal danke fuer die noble hilfestellung.
allerdings war das obige xml in meiner tast nur ein auszug.
was wuerde sich in deinem methodenvorschlag aendern, wenn
nicht <text> das root element, sondern, sagen wir <start> root waere und <text> ein direktes kind von
<start> ist ?


vielleicht kannst du kurz antworten ?
danke & gruß,
.p


----------

