tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
20
ZUGRIFFE
3595
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    flashray flashray ist offline Mitglied Rubin
    Registriert seit
    Sep 2005
    Ort
    Mannheim
    Beiträge
    1.325
    Hallo,

    bräuchte einen etwas komplizierteren XPath Ausdruck. Habs leider nicht selbst lösen können:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    
    <?xml version="1.0" encoding="iso-8859"?>
    <rss version="0.91">
    <channel>
       <channelTitle>SPIEGEL ONLINE</channelTitle>
       <description>Schneller wissen, was wichtig ist</description>
       <language>de</language>
     
       <item>
          <title>Kriegsverbrechertribunal Den Haag</title>
          <link>http://www.spiegel.de/politik/ausland/0,1519.html</link>
       </item>
       <item>
          <title>Wir sind krank durch Konsolen: Nintendo gegen Wii</title>
          <link>http://www.spiegel.de/netzwelt/web/0,1520.html</link>
       </item>
       <item significant="true">
          <title>Einzelhandel: Ladendiebe stehlen sechs Millionen Euro</title>
          <link>http://www.spiegel.de/wirtschaft/0,1521.html</link>
       </item>
       <item>
          <title>Piloten-Ansage: "Keine Sorge - wir fallen"</title>
          <link>http://www.spiegel.de/reise/aktuell/0,1522.html</link>
       </item>
       <item>
          <title>Palaestinenserkaempfe: Hamas greift durch</title>
          <link>http://www.spiegel.de/politik/ausland/0,1523.html</link>
       </item>
       <item significant="true">
          <title>Markenrechtsstreit: Budweiser erleidet Niederlage</title>
          <link>http://www.spiegel.de/wirtschaft/0,1524.html</link>
       </item>
       <item>
          <title>Machtuebergabe in Bayern: Beckstein an Stoiber ab</title>
          <link>http://www.spiegel.de/politik/deutschland/0,1525.html</link>
       </item>
    </channel>
    </rss>

    Die Aufgabenstellung heißt:
    Geben Sie alle title-Knoten aus, die das Wort "wir" enthalten und zusätzlich alle link-Knoten, die aus dem Ressort "politik" stammen.

    Mein Ansatz bislang ist dieser, er tut aber nicht was ich möchte:
    Code :
    1
    
    /rss/channel/item/*[(contains(text(),"politik") & node-name()="link") | (contains(text(),"wir") & node-name()="title")]

    http://www.futurelab.ch/xmlkurs/xpath.de.html
    Hab hier vergeblich alles mögliche ausprobiert. Vielleicht hätte hier jemand einen Tip für mich.

    Vg Erdal
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Hi.
    Zitat Zitat von flashray Beitrag anzeigen
    Mein Ansatz bislang ist dieser, er tut aber nicht was ich möchte:
    Code :
    1
    
    /rss/channel/item/*[(contains(text(),"politik") & node-name()="link") | (contains(text(),"wir") & node-name()="title")]

    http://www.futurelab.ch/xmlkurs/xpath.de.html
    Hab hier vergeblich alles mögliche ausprobiert. Vielleicht hätte hier jemand einen Tip für mich.
    Du verwendest die falschen Operatoren. Der | Operator vereinigt 2 Knotenmengen, den & Operator gibt es gar nicht. Du solltest die boolschen Operatoren and und or verwenden. Siehe z.B. http://www.w3schools.com/xpath/xpath_operators.asp

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    flashray flashray ist offline Mitglied Rubin
    Registriert seit
    Sep 2005
    Ort
    Mannheim
    Beiträge
    1.325
    Hallo deepthroat,

    ja mit dem Operator or komme ich ein Stückchen weiter. Jetzt nimmt er beide. Wie kann ich aber einschränken, das er einen Filter nur das Tag link, und den anderen Filter für das Tag title mit einbeziehen soll?


    Vg Erdal
     

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Zitat Zitat von flashray Beitrag anzeigen
    Hallo deepthroat,

    ja mit dem Operator or komme ich ein Stückchen weiter. Jetzt nimmt er beide. Wie kann ich aber einschränken, das er einen Filter nur das Tag link, und den anderen Filter für das Tag title mit einbeziehen soll?
    Das geschieht in dem Fall automatisch, da das and eine höhere Priorität hat als das or. Ansonsten durch Klammerung der Ausdrücke.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    flashray flashray ist offline Mitglied Rubin
    Registriert seit
    Sep 2005
    Ort
    Mannheim
    Beiträge
    1.325
    Das Problem hierbei ist, das die Funktion node-name(...) einen Parameter erwartet, weiss aber nicht wass ich reinschreiben könnte. Habs mit * oder //* ähnlich versucht ..., ohne Erfolg .
     

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Zitat Zitat von flashray Beitrag anzeigen
    Das Problem hierbei ist, das die Funktion node-name(...) einen Parameter erwartet, weiss aber nicht wass ich reinschreiben könnte. Habs mit * oder //* ähnlich versucht ..., ohne Erfolg .
    Nimm einfach, die Funktion name().

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    flashray flashray ist offline Mitglied Rubin
    Registriert seit
    Sep 2005
    Ort
    Mannheim
    Beiträge
    1.325
    /rss/channel/item/*[contains(text(),"politik") and name()="link" or contains(text(),"wir") and name()="title"]

    Ja nun damit ist die Aufgabenstellung fast gelöst. Ich hatte name() garnicht gesehen, da es in der Liste ganz weit unten gesondert war.

    Das letzte was noch fehlt ist, eine case-insensitive Suche. D.h. es sollten auch Vorkommnisse wie "Wir" akzeptiert werden. Ein schachteln mit lower-case() führt aber zu einem Fehler:
    contains(lower-case(text()),"wir")
     

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Zitat Zitat von flashray Beitrag anzeigen
    /rss/channel/item/*[contains(text(),"politik") and name()="link" or contains(text(),"wir") and name()="title"]

    Ja nun damit ist die Aufgabenstellung fast gelöst. Ich hatte name() garnicht gesehen, da es in der Liste ganz weit unten gesondert war.

    Das letzte was noch fehlt ist, eine case-insensitive Suche. D.h. es sollten auch Vorkommnisse wie "Wir" akzeptiert werden. Ein schachteln mit lower-case() führt aber zu einem Fehler:
    contains(lower-case(text()),"wir")
    Die lower-case Funktion gibt es erst seit XPath 2.0. In XPath 1.0 könntest du die translate Funktion benutzen:
    Code :
    1
    
    translate(name(), "ABCDE...", "abcde...")
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  9. #9
    flashray flashray ist offline Mitglied Rubin
    Registriert seit
    Sep 2005
    Ort
    Mannheim
    Beiträge
    1.325
    Vielen Dank für die Unterstützung!

    Kennst du vielleicht einen anderen Online Interpreter der auch XPath 2.0 kann? Hab ein Paar ausprobiert, keiner wollte lower-case() akzeptieren.

    Oder vielleicht ein Eclipse Plugin das ohne großen Aufwand XPath Ausdrücke auswerten kann?

    Vg Erdal
     

  10. #10
    flashray flashray ist offline Mitglied Rubin
    Registriert seit
    Sep 2005
    Ort
    Mannheim
    Beiträge
    1.325
    Ja damit hat es nun endlich geklappt!

    Code :
    1
    
    /rss/channel/item/*[contains(text(),"politik") and name()="link" or contains(translate(text(), "WIR", "wir"),"wir") and name()="title"]
     

  11. #11
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Zitat Zitat von flashray Beitrag anzeigen
    Vielen Dank für die Unterstützung!

    Kennst du vielleicht einen anderen Online Interpreter der auch XPath 2.0 kann? Hab ein Paar ausprobiert, keiner wollte lower-case() akzeptieren.

    Oder vielleicht ein Eclipse Plugin das ohne großen Aufwand XPath Ausdrücke auswerten kann?
    Du könntest den XPath Explorer (http://sourceforge.net/projects/xpe) verwenden.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  12. #12
    sim26 sim26 ist offline Mitglied Bronze
    Registriert seit
    Mar 2006
    Beiträge
    37
    Hallo alle Tutorials users,

    ich habe bitte ein frage zum Thema XPath mit Java benutzen:

    ich habe mein String so definiert um den ganz xml "rss" nach "wir" zu suchen.
    ich kriege aber nur einem einzigen Output, und das war die erste knote wo er "wir" findet. dann hört mein Programme nach weiteren "wir" zu suchen.

    String expression = ("rss/channel/item/*[ contains(translate(text(), \"WIR\", \"wir\"),\"wir\") ]");

    ich denke irgendwas habe ich in meinem String Definition falsch geschrieben.

    oder?

    Danke
     

  13. #13
    sim26 sim26 ist offline Mitglied Bronze
    Registriert seit
    Mar 2006
    Beiträge
    37
    mein code ist:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
     
    import java.io.IOException; import javax.xml.parsers.*; 
    import javax.xml.soap.Node;
    import javax.xml.xpath.*;
    import org.w3c.dom.Document;
    import org.xml.sax.SAXException;
    /** * @author Darimont * * TODO Comment me */
     
    import javax.xml.xpath.XPath; 
    import javax.xml.xpath.XPathExpressionException; 
    import javax.xml.xpath.XPathFactory; 
    import org.xml.sax.InputSource; 
    public class XPathExample {
        /** * Creates a new instance of xpath */ 
        public static void main(String[] args) {
            String expression = ("rss/channel/item/*[ contains(translate(text(), \"WIR\", \"wir\"),\"wir\") ]");
            InputSource iSource = null; 
        try {
            iSource = new InputSource("test.xml");
        } catch(Exception e) {
            e.printStackTrace(System.out); }
        XPath xpath = XPathFactory.newInstance().newXPath(); 
        try {   
            String output = xpath.evaluate(expression, iSource);
            System.out.println("output: " + output);  
            } catch(XPathExpressionException e) {
                e.printStackTrace(System.out); 
                } catch(Exception e) {
                    System.out.println(e.toString()); } } }

    die Output ist nur:

    Code :
    1
    
    output: Wir sind krank durch Konsolen: Nintendo gegen Wii

    danke
     

  14. #14
    sim26 sim26 ist offline Mitglied Bronze
    Registriert seit
    Mar 2006
    Beiträge
    37
    kann mir bitte keiner helfen ist das so schwer

     

  15. #15
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Hi.
    Zitat Zitat von sim26 Beitrag anzeigen
    ich habe mein String so definiert um den ganz xml "rss" nach "wir" zu suchen.
    ich kriege aber nur einem einzigen Output, und das war die erste knote wo er "wir" findet. dann hört mein Programme nach weiteren "wir" zu suchen.

    String expression = ("rss/channel/item/*[ contains(translate(text(), \"WIR\", \"wir\"),\"wir\") ]");

    ich denke irgendwas habe ich in meinem String Definition falsch geschrieben.
    Nein. Aber wenn du den XPath einmal anwendest, und einen String zurückbekommst - wie soll das funktionieren, dass du mehrere Resultate erhälst?

    Versuch's mal so:
    Code java:
    1
    2
    3
    4
    5
    6
    
    import org.w3c.dom.NodeList;
     
    NodeList nl = (NodeList) xpath.evaluate(expression, iSource, XPathConstants.NODESET);
    for (int i = 0; i < nl.getLength(); ++i) {
        System.out.println(nl.item(i).getFirstChild().getNodeValue());
    }
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. Xpath falsch?
    Von suntrop im Forum XML Technologien
    Antworten: 8
    Letzter Beitrag: 04.08.10, 12:23
  2. Xml Jdom Xpath
    Von delta79 im Forum Java
    Antworten: 0
    Letzter Beitrag: 17.11.08, 15:26
  3. XPATH & XSL-Transformation
    Von JerseyGirl im Forum XML Technologien
    Antworten: 0
    Letzter Beitrag: 09.09.08, 13:12
  4. Java XPath Problem (1.5 javax.xml.xpath.*)
    Von mad_dark_angel im Forum Java
    Antworten: 5
    Letzter Beitrag: 10.05.06, 14:39
  5. xpath joins: wie?
    Von nautiLus` im Forum XML Technologien
    Antworten: 2
    Letzter Beitrag: 05.12.05, 21:45