nochmal XPath :-)

Status
Nicht offen für weitere Antworten.

phipsnet

Mitglied
ich kann ja mit XPath auch einen einzelnen knoten ansprechen, oder ?

bsp.:
Code:
XPath myXPath = XPath.newInstance("//text/page[@nummer='" + PageNo + "']");

bei pageNo=2
....springt auf das knotenelement <page nummer="2">

wie kann ich auf diesem knoten weiterarbeiten ? resp.
kann ich mit methoden aus jdom auf diesem knoten (als element)
weiterarbeiten, zb. mit ?.getChildren("irgendwas")


danke (vor allem fuer ausauer und geduld) & gruß
.p
 

clemson

Bekanntes Mitglied
mit was arbeitest du?

wenn du mit jdom arbeitet, dann geht das so:

du legst dir eine neue abfrage an.

Code:
XPath myXPath = XPath.newInstance("//text/page[@nummer='" + PageNo + "']");

mittels

Code:
List ls = myXPath.selectNodes(org.jdom.Document);

bzw.

Code:
Object el = myXPath.selectSingleNode(org.jdom.Document);

dein element holen.

jetzt weisst du, dass der abgefragte String ein "org.jdom.Element" auf ein org.jdom.Element zeigt.

das heisst, du musst nur noch das Ergebnis casten, und dann hast du dein Element, mit dem du weiter arbeiten kannst (kinder holen, neue kinder dazu, ...)

Code:
org.jdom.Element element = (org.jdom.Element) ls.get(0);

bzw.

Code:
org.jdom.Element element = (org.jdom.Element) el;

und jetzt kannst du mittels

Code:
java.util.List kinder = element.getChildren();

auf die Kinder zugreifen...
 

phipsnet

Mitglied
hallo nochmal;

leider wirft meine methode immer eine zeilenanzahl von 0 zurueck.
hier die methode:

Code:
    //Liefert Abzahl der Zeilen einer bestimmten Seite
    public int var_getLinesSum(int PageNo) throws Exception, JDOMException {
        XPath myXPath = XPath.newInstance("//text/page[@nummer='" + PageNo + "']"); 
 		List pageX = myXPath.selectNodes( doc );
 		Element page = (org.jdom.Element)pageX.get(0);
 		List lines = page.getChildren("line");
 		Iterator lines_it = lines.iterator();
 		int i = 0;
 		while(lines_it.hasNext()) {
 			Element current = (Element)lines_it.next();
 			i++;
 		}
 		return i;
    }


die methode rufe ich zb. mit parameter 1 auf, sodass er iom xml auf den knoten <page nummer="1"> springen soll und dort die kinder "line" aufsammelt und durchzaehlt, danach die anzahl zurueckgibt. koennte es sein, dass <line> garkein kind von <page> ist ? (ich hab das xml leider nicht fabriziert und auch keine dtd dazu) falls das so ist: wie komme ich sonst an die anzahl der zeilen fuer eine bestimmte seite.
(falls du das gesamte xml sehen moechtest: http://www.karlson.homepage.t-online.de/klageV2.xml)

1000dank; & lg.
.p
 

clemson

Bekanntes Mitglied
phipsnet hat gesagt.:
koennte es sein, dass <line> garkein kind von <page> ist ?

so ist es, <line> ist kein kind von <page> sondern von <text> ...

wenn du die anzahl aller //text/line elemente willst, kannst du beispielsweise die count - funktion von xpath benützen:

Code:
count(//text/line)

liefert mir bei diesem XML 19.0
 

phipsnet

Mitglied
aber wie kann ich dann die <line> knoten zaehlen, die zwischen zwei <page> knoten stecken ?

also:
Code:
<page nummer="1"/>
<line/>
<line/>
<page nummer="2"/>
<line>

usw...

hast du eine idee ?
 

clemson

Bekanntes Mitglied
ich würde mir den start-knoten mittels XPath-Abfrageholen

Bsp.:
Code:
//text/page[@nummer='1']

dann würde ich in JDOM eine while schleife machen, welche mir jeden namen des jeweiligen geschwister-elements auf gleichheit mit "line" macht, ist das geschwister-element ein line element, so wird eine zählervariable erhöht.

ist das element jedoch ein page element, so wird abgebrochen...
 

clemson

Bekanntes Mitglied
folgende xpath abfrage zählt dir alle line elemente, welche zwischen 2 page elementen sind...

Code:
count(//text/page[@nummer=1]/following-sibling::*[name()='line' and following-sibling::page[@nummer=2]])


bring mir bei deinem beispiel 3.0


das erspart dir die ganze sache mit der while schleife.
 

phipsnet

Mitglied
laeuft das dann auch mit:

Code:
XPath lines = XPath.newInstance( count(//text/page[@nummer=1]/following-sibling::*[name()='line' and following-sibling::page[@nummer=2]]))

?
 

clemson

Bekanntes Mitglied
ja, aber es muss heissen:

Code:
XPath lines = XPath.newInstance( "count(//text/page[@nummer=1]/following-sibling::*[name()='line' and following-sibling::page[@nummer=2]])");
 

clemson

Bekanntes Mitglied
phipsnet hat gesagt.:
wie ziehe ich aus der abrage einen int, den ich zurueckgeben muss ?

was meinst du? wie du aus der abfrage die anzahl der line objekte bekommst??

frage einfach mal den String ab und dann lädst du das ergebnis in ein object. schau dir dann an, welchen typ dieses objekt hat, und dann schauen wir weiter ;)


etwas so

Code:
XPath xp = XPath.newInstance( "count(//text/page[@nummer=1]/following-sibling::*[name()='line' and following-sibling::page[@nummer=2]])" );
Object nr = xp.selectSingleNode(doc);
System.out.println(nr.getClass().toString());
 

phipsnet

Mitglied
die methode, die die anzahl der zeilen auf einer best. seite ermittelt, soll ja einen int
zurureckgeben, deshalb fragte ich, wie ich den int aus dieser abfrage ziehen kann...
(also wie ich das ergebnis dieser abfrage in einem int speichern kann...)

ausserdem frage ich mich, ob sowas hier geht:

im methodenaufrauf wird der methode eine seitenzahl (int PageNo) als parameter uebergeben, die ich gerne in meine xpath abfrage einbauen moechte...

Code:
( "count(//text/page[@nummer='" + PageNo + "']/following-sibling::*[name()='line' and following-sibling::page[@nummer='" + PageNo + 1 + "']])");
 

clemson

Bekanntes Mitglied
okay,

dann erstell die jetz ein Double Objekt:

Code:
Double anzahl = (Double) nr;

und dann müsste er mittels anzahl.intValue() den int Wert zurückgeben..


probier das mal...
 

phipsnet

Mitglied
kool,
das geht. was offensichtlich nicht geht, ist eine abrfage der folgenden art:

Code:
( "count(//text/page[@nummer='" + PageNo + "']/following-sibling::*[name()='line' and following-sibling::page[@nummer='" + PageNo + 1 + "']])");

weisst du, warum ?
 

clemson

Bekanntes Mitglied
was geht denn nicht?

vielleicht liegts daran, dass du die int Werte innerhalb von einfachen anführungszeichen steckst ( ' )...

und bei der abfrage

Code:
...page[@nummer='" + PageNo + 1 + "']]...

musst du - wenn ich deinen gedankengang richitg verstanden habe -

Code:
...page[@nummer='" + (PageNo + 1) + "']]...

schreiben. sonst schreibt er page[@nummer='11'] anstatt page[@nummer='2']
 

clemson

Bekanntes Mitglied
eine frage hab ich noch:

wie hast du das jetzt mit der abfrage realisiert??

könntest du mal bitte den ganzen java-code posten...
 

phipsnet

Mitglied
den hier?

klassenkopf + konstruktor:
Code:
public class ImportEd {
  	 	
    private int allPageNo;
    private int var_allLines;
    protected String path; 
    protected Element root;
    protected Document doc;
	

    public ImportEd(String path)throws Exception, ClassCastException {
    this.path = path;
    SAXBuilder builder = new SAXBuilder();
    this.doc = builder.build(new File(path));
    this.root = doc.getRootElement();
    this.allPageNo = 0;
    }


...und die besagte methode:
Code:
    //Liefert Anzahl der Zeilen einer bestimmten Seite
    public int var_getLinesSum(int PageNo) throws Exception, JDOMException {
        
      XPath xp = XPath.newInstance( "count(//text/page[@nummer='" + PageNo + "']/following-sibling::*[name()='line' and following-sibling::page[@nummer='" + (PageNo + 1) + "']])" );
		Object o = xp.selectSingleNode(doc);
		Double anzahl = (Double) o;
		return anzahl.intValue();
	}
 

clemson

Bekanntes Mitglied
ich wollte nur mal sehen, wie du das jetzt mit der abfrage realisiert hast.

man muss also doch die einfachen anführungszeichen machen....
 

phipsnet

Mitglied
ha!
der clou ist natuerlich, dass es zwar eine schoene idee ist, aber beim aufruf der methode mit parameterwert fuer die letzte seite im dokument, wie PageNo +1 natuerlich nicht gefunden und das ergebnis fuer die letzte seite ist deshalb immer 0

:-(
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Kirby.exe Probleme mit XML XPATH Select XML & JSON 3
B XPath soll XML liefern XML & JSON 7
O XPATH Problem - Anfänger XML & JSON 4
M dom4j unberechtigte Invalid XPath expression XML & JSON 12
W XPath schreiben XML & JSON 1
P HTML XPath XML & JSON 1
S Ersatz für die veraltete Klasse XPath XML & JSON 1
C XPath: Alle Kinder in einer Schleife auslesen XML & JSON 2
P Xpath zugriff auf Attribute XML & JSON 3
P "XPath is deprecated" XML eclipse XML & JSON 3
G HtmlUnit XPath XML & JSON 5
D XPath-Query XML & JSON 2
I XPath Namensräume und auslesen einzelner Knoten XML & JSON 3
AMStyles XPATH Befehl SVG Java XML & JSON 2
G xpath: in Kindelement zwei Attribut-Werte auslesen XML & JSON 2
G xpath: Inhalt eines Kindelements auslesen XML & JSON 2
H ChildNode via XPath ansprechen XML & JSON 2
G JDOM - aus Children-Liste ein Child direkt ansprechen ohne XPath? XML & JSON 9
S Attribute von Elementen auslesen mit XPath XML & JSON 2
T Xpath & JDOM Element Pfad ausgeben XML & JSON 2
W XPath + Inhalt aus <td> XML & JSON 2
R XPath - frage zur Adressierung XML & JSON 3
reibi XPath XML & JSON 14
M xPath liefert leeres Nodeset XML & JSON 2
M Probleme mit XPath bei Java XML & JSON 5
W Element mit XPath @id ermitteln wenn nur ein teil der id bekannt ist XML & JSON 2
F XPath-Problem mit DOM4J XML & JSON 8
T XPath Problem: finden einer Node nach Attributswert XML & JSON 2
O XPATH gesucht XML & JSON 6
G XPATH-Frage XML & JSON 2
L Element manipulieren in einem DOMResult per XPath XML & JSON 10
P XPath und Namespaces XML & JSON 3
G XPath - replace function funktioniert nicht XML & JSON 3
E XPATH-Ausdruck mit not XML & JSON 4
E Wieso liefert dieser XPATH-Ausdruck nicht die richtige Anzahl Treffer? XML & JSON 8
M XPath Ausdruck validieren XML & JSON 2
N XPath Adressierung XML & JSON 7
F XPath frage XML & JSON 4
B Optionaler XPath pfad XML & JSON 2
B XPath frage XML & JSON 2
T Frage zu XQuery (XQJ) / XPath XML & JSON 2
P XPath Problem XML & JSON 2
S Problem mit XPath XML & JSON 4
T Mit XPATH finden und dann änder XML & JSON 2
T EXSD auslesen mit XPath und JDOM XML & JSON 8
G XPath gesucht für Tag mit konkretem Content XML & JSON 2
A XPath Problem XML & JSON 2
C XPath in JDOM klappt nicht XML & JSON 2
T Prbolem XPath XML & JSON 2
X Xpath, alle Element die mit "user" beginnen auswäh XML & JSON 2
loadbrain XPath Problem XML & JSON 2
M brauche große XML-Datei für XPath-Tests XML & JSON 4
M JDOM und XPath, zu Element zugehörigen XPath-Ausdruck XML & JSON 5
F JDOM und XPath - Problem mit Namespace ohne Prefix XML & JSON 5
F hilfe bei xpath-ausdruck XML & JSON 2
K java + xpath -> performanceproblem XML & JSON 9
H Xpath kindelemente auslesen XML & JSON 2
S Xml zurück in xpath wandeln XML & JSON 8
G Frage zu XPath XML & JSON 2
flashfactor Filtern mittels XPATH XML & JSON 4
M XSL/XPath - Nur ersten Wert mit selben Attribut XML & JSON 4
M XPath Problem im Zusammenhang mit document() XML & JSON 2
M Frag zu xsl:when beziehungsweise XPath XML & JSON 3
F JDom und XPath XML & JSON 12
C xpath funktioniert nicht XML & JSON 5
M XPATH und RSS (Problem namespaces) XML & JSON 7
P XPath . XML & JSON 2
T Rekursiver Verzeichniss Baum in XML & XPath XML & JSON 4
clemson xpath mit jdom XML & JSON 2
Wildcard xpath Parser XML & JSON 8

Ähnliche Java Themen

Neue Themen


Oben