Announcement

Collapse
No announcement yet.

mit xpath auf attribut zugreifen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • mit xpath auf attribut zugreifen

    hey leute ich hab hier wiedermal ein problem und weiß nicht was ich tun soll.

    ich möchte bei der ausgabe folgendes stehen haben:

    Kontakt 1 (a1): Max Mustermann, wohnhaft in: ErsteStadt
    Kontakt 2 (a2): Erika Musterfrau, wohnhaft in: ErsteStadt
    Kontakt 3 (a3): Jane Doe, wohnhaft in: Washington, DC
    Kontakt 4 (a4): John Doe, wohnhaft in: Washington, DC
    doch ich versteh nicht wie ich auf die "id" im element "ort" zugreifen kann, damit es mir den ortsnamen ausgibt.


    hier die xml:

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <adressbuch>
    	<orte>
    		<ort id="o1">
    			<plz>12345</plz>
    			<name>ErsteStadt</name>
    		</ort>
    		<ort id="o2">
    			<plz>67890</plz>
    			<plz>23456</plz>
    			<name>ZweiteStadt</name>
    		</ort>
    		<ort id="o3">
    			<plz>56920</plz>
    			<plz>56944</plz>
    			<name>Washington, DC</name>
    		</ort>
    	</orte>
    	<adressen>
    		<adresse id="a1" ort="o1">
    			<vorname>Max</vorname>
    			<nachname>Mustermann</nachname>
    			<email>[email protected]</email>
    			<erstellDatum>22.01.2011</erstellDatum>
    			<telefonNummer>
    				<geheimnummer/>
    			</telefonNummer>
    			<notiz>Hinweis <strong>fett</strong></notiz>
    		</adresse>
    		<adresse id="a2" ort="o1">
    			<vorname>Erika</vorname>
    			<nachname>Musterfrau</nachname>
    			<email>[email protected]</email>
    			<erstellDatum>23.01.2011</erstellDatum>
    			<telefonNummer>
    				<nummer>0456 45678</nummer>
    			</telefonNummer>
    			<notiz>Hinweis <strong>fett</strong></notiz>
    			<notiz>Hinweis <strong>fett</strong></notiz>
    		</adresse>
    		<adresse id="a3" ort="o3">
    			<vorname>Jane</vorname>
    			<nachname>Doe</nachname>
    			<email>[email protected]</email>
    			<erstellDatum>24.01.2011</erstellDatum>
    			<telefonNummer>
    				<geheimnummer/>
    			</telefonNummer>
    			<notiz/>
    		</adresse>
    		<adresse id="a4" ort="o3">
    			<vorname>John</vorname>
    			<nachname>Doe</nachname>
    			<email>[email protected]</email>
    			<erstellDatum>25.01.2011</erstellDatum>
    			<telefonNummer>
    				<nummer>0789 123456</nummer>
    			</telefonNummer>
    			<notiz/>
    		</adresse>
    	</adressen>
    </adressbuch>


    und hier die xpath datei:

    Code:
    package dom;
    
    import org.w3c.dom.*;
    import javax.xml.parsers.*;
    import javax.xml.xpath.*;
    
    public class XPathAufgabe {
    	
    	public static void main(String[] args) {
    
    		try {
    			
    			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    			DocumentBuilder builder = factory.newDocumentBuilder();
    			Document xmlDocument = builder.parse("src/dom/adressbuch.xml");
    					
    			XPathFactory xPathFactory = XPathFactory.newInstance();
    			XPath xpath = xPathFactory.newXPath();
    			NodeList adressenNodes = (NodeList) xpath.evaluate("//adressbuch/adressen/adresse", xmlDocument, XPathConstants.NODESET);
    			NodeList orteNodes = (NodeList) xpath.evaluate("//adressbuch/orte/ort", xmlDocument, XPathConstants.NODESET);
    			
    			for(int i=0; i<adressenNodes.getLength(); i++){
    				NodeList vornameNode = (NodeList) xpath.evaluate("vorname",adressenNodes.item(i), XPathConstants.NODESET);
    				NodeList nachnameNode = (NodeList) xpath.evaluate("nachname",adressenNodes.item(i), XPathConstants.NODESET);
    				String id = (String) xpath.evaluate("@id",adressenNodes.item(i), XPathConstants.STRING);
    				System.out.println("Kontakt " + i + "("+ id + "): " + vornameNode.item(0).getTextContent()+ " " + nachnameNode.item(0).getTextContent() + ", " + "wohnhaft in: ");
    			}
    			
    		} catch(Exception ex) {		
    			System.out.println(ex.getMessage());
    		}
    
    	}
    
    }

  • #2
    Muss es XPath per JAXP API sein? Unter Java kann ja sicher auch XSLT benutzen, XPath-Implementierungen wie Xalan oder Saxon können ja nicht nur XPath sondern auch XSLT:
    Code:
    <xsl:stylesheet
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      version="1.0">
      
      <xsl:output method="text"/>
      
      <xsl:key name="ort-by-id" match="orte/ort" use="@id"/>
      
      <xsl:template match="/">
        <xsl:apply-templates select="adressbuch/adressen/adresse"/>
      </xsl:template>
      
      <xsl:template match="adresse">
        <xsl:value-of select="concat('Kontakt ', 
          position(), ' (', @id, '): ', vorname, ' ', nachname, 
          ', wohnhaft in: ', key('ort-by-id', @ort)/name, '
    ')"/>
      </xsl:template>
     
    </xsl:stylesheet>

    Comment


    • #3
      Wenn es wirklich per XPath API gelöst werden soll, dann muss man halt das "ort"-Attribut nehmen und per
      Code:
      //ort[@id = ortAttribut]/name
      auf den Ort zugreifen, etwa
      Code:
      			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      			factory.setNamespaceAware(true);
      			DocumentBuilder builder = factory.newDocumentBuilder();
      			Document xmlDocument = builder.parse("test2011051401.xml");
      					
      			XPathFactory xPathFactory = XPathFactory.newInstance();
      			XPath xpath = xPathFactory.newXPath();
      			NodeList adressenNodes = (NodeList) xpath.evaluate("adressbuch/adressen/adresse", xmlDocument, XPathConstants.NODESET);
      			
      
      			for (int i = 0; i < adressenNodes.getLength(); i++)
      			{
      			        Element adressse = (Element)adressenNodes.item(i);
      			        String vorname = xpath.evaluate("vorname", adressse);
      			        String nachname = xpath.evaluate("nachname", adressse);
      				String id = (String) xpath.evaluate("@id",adressse);
      				System.out.println("Kontakt " + (i + 1)
      				  + " ("+ id + "): " + vorname + " " + nachname 
      				  + ", " + "wohnhaft in: " + xpath.evaluate("//ort[@id = '" + adressse.getAttribute("ort") + "']/name", xmlDocument));
      			}

      Comment


      • #4
        danke, mit

        //ort[@id = ortAttribut]/name
        habe ich es endlich hingekriegt!!

        Comment


        • #5
          ich hätte da noch ne frage. wie kann ich per xpath ausdruck in der xml datei den vorname-knoten jedes zweiten kontakts ausgeben?

          hab bisher das hingekriegt, doch das gibt mir jede zweite adresse aus.

          //adresse[(position() mod 2) = 0]
          wie komme ich von da zum unterknoten "vorname"?

          Comment


          • #6
            Einfach einen "step" (http://www.w3.org/TR/xpath/#section-Location-Steps) mit der Selektion von "vorname" anhängen:
            Code:
            //adresse[(position() mod 2) = 0]/vorname

            Comment

            Working...
            X