markus: xPath - bestimmen

Hallo alle zusammen.
Habe eine Methode programmiert, die mir einen Path aus meine XML- Datei ausgeben soll.
Es funktionier aber nur wenn jedes Element nur ein Mal vorkommt. Was mache ich wenn Ein Element mehrere Kinder hat?
z.B. < article>
 <team>
  <member = 1 />
  <member = 2 />
 </team>
 </article>
Ist klar, dass ich ein „if - abfrage“ machen soll. Und dann ..? nach getChildElement suchen? Und position bestimmen?

Hier ist  mein code:

public static String getxPath( Element x ) {

Node t=x;
  final StringBuffer res=new StringBuffer();
  while (t instanceof Element) {
   res.insert(0, "/"+t.getNodeName());

if ….???

t=t.getParentNode();
  }
  return res.toString();
 }
Liege ich richtig, oder wie macht man das?

  1. Hi markus!

    Habe eine Methode programmiert, die mir einen Path aus meine XML- Datei ausgeben soll.
    Es funktionier aber nur wenn jedes Element nur ein Mal vorkommt. Was mache ich wenn Ein Element mehrere Kinder hat?

    Das kann gar nicht sein. =)
    Schließlich hangelst du dich über die Elternelemente nach oben. Und jedes Element hat nunmal nur genau ein Elternelement. Da treten keine Konflikte auf.

    Vielleicht hast du ja Probleme, dass richtige Knotenelement, von dem du den Pfad bestimmen willst, zu finden?!

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    1. Schließlich hangelst du dich über die Elternelemente nach oben. Und jedes Element hat nunmal nur genau ein Elternelement. Da treten keine Konflikte auf.

      Du hast richtig geschrieben, aber ein Elternelement kann mehrere Kinderelemente haben.
      Vielleicht habe ich mich falsch ausgedrückt, versuche noch Mal.
      Nach meine jetzige Stand bekomme ich diesen Pfad : /article/team/member.
      Welche member ist unklar.
      Es soll dies rauskommen: /artikle/team/member[1]. (oder 2 , je nach  Variation).
      H☼psel

      1. Hi markus!

        Hast du schon eine Lösung gefunden?

        Du wählst doch am Anfang einen dieser Knoten aus. Zu diesem Zeitpunkt müsstest du auch abfragen können, wieviele Geschwister er hat, an welcher Stelle er steht und welche Attribute er besitzt.

        Konkrete Funktionsnamen kann ich dir nicht nennen. Hab schließlich mit xPath noch nichts gemacht.

        MfG H☼psel

        --
        "It's amazing I won. I was running against peace, prosperity, and incumbency."
        George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
        1. Hi H☼psel!

          Hast du schon eine Lösung gefunden?

          habe die Tage mich nicht damit beschäftigt, bin gerade dabei.

          Du wählst doch am Anfang einen dieser Knoten aus. Zu diesem Zeitpunkt müsstest du auch abfragen können, wieviele Geschwister er hat

          So mache ich auch, habe jetzt in meine While-Schleife noch eine For-Schleife eingebaut, die Überprüft die Kinder. Leider komme ich nicht in meine While-Schleife zurück (es wird nur ein Mal ausgeführt). oder ich bekomme Endlosschleife. Kann vielleicht einer mir sagen wo ich falsch liege.

          public class DomPathExtractor {

          public static String getxPath( Element x ) {
              Node t=x;
              final StringBuffer res=new StringBuffer();
              int count =0;
              while (t instanceof Element) {
           res.insert(0, "/"+t.getNodeName());
           final NodeList childs=t.getChildNodes();
           for (int i = 0; i<childs.getLength(); i++){
            t=childs.item(i);
           }
            if (childs.equals(t.getNodeName()))  {
            ++count;
                   res.insert(0,"/"+t.getNodeName()+"["+count+"]");;
            }
           t=t.getParentNode();
              }
              return res.toString();
            }
          }