7. XML

A VIK Wikiből
A lap korábbi változatát látod, amilyen Ferrero (vitalap | szerkesztései) 2013. január 8., 00:16-kor történt szerkesztése után volt.
(eltér) ← Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)

7.1. Általános

  • jól formált
  • opcionális fejléc, gyökérelem, nyitó-záró tag
  • valid: megfelel a sémának (DTD/XSD)

7.2. XSD

gyökérelem

általános szerkezet

<!-- beépített típusok -->
xs:string, xs:decimal, xs:integer, xs:boolean, xs:date, xs:time

<!-- egyszerű elem -->
<xs:element name="xxx" type="xs:string" [default="zzz" | fix="qqq"]/>

<!-- attribútum -->
<xs:attribute name="xxx" type="xs:string" [default="zzz" | fix="qqq"] [use="required"]/>

<!-- egyszerű típusdefiníció -->
<xs:simpleType>
  <xs:restriction base="xs:string">
	 <xs:length value="8"/>
  </xs:restriction>
</xs:simpleType>
megkötések: totalDigits, fractionDigits, enumeration, length, minLength, maxLength, pattern...

<!-- összetett típusdefiníció -->
<xs:complexType name="personinfo">
  <xs:sequence>
	 <xs:element name="firstname" type="xs:string"/>
	 <xs:element name="lastname" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

<!-- öröklés -->
<xs:complexType name="fullpersoninfo">
  <xs:complexContent>
	 <xs:extension base="personinfo">
		<xs:sequence>
		  ... <!-- új elemek -->
		</xs:sequence>
	 </xs:extension>
  </xs:complexContent>
</xs:complexType>

Indikátorok

  • Sorrend: all, choice, sequence
  • Gyakoriság: maxOccurs, minOccurs
  • Csoportosítás: <group>, <attributeGroup> (pár element/attribute összefogása, de nem típusként)

helyettesítés

  • használhatjuk az eredeti és az új nevet is
<xs:element name="name" type="xs:string"/>
<xs:element name="név" substitutionGroup="name"/>

hivatkozás XML-ből XSD-re

<note xmlns=http://www.w3schools.com
		xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
		xsi:schemaLocation="http://www.w3schools.com note.xsd">
<!-- XML adatok -->
</note>

7.3. XPath

  • adott nevű csomópont gyerekei: csomópontnév
  • gyökérelem: /
  • az aktuális elemtől választ, mindegy, hogy milyen mélyen: //node
  • aktuális elem: .
  • az aktuális elem szülője: ..
  • attribútum: @attr
  • bármely elem: *
  • bármely attribútum: @*
  • index, vagy feltétel elemre, attribútumra, vagy függvény: [feltétel]
    • csomópont kiválasztás: node()
    • szöveg csomópont kiválasztás: text()

ágak (hosszú név)

  • self
  • attribute
  • parent
  • child
  • ancestor / ancestor-or-self - összes ős
  • descendant / descendant-or-self - összes leszármazott
  • following / preceding - minden utána/előtte lévő elem
  • following-sibling / preceding-sibling - minden utána/előtte lévő testvérelem
  • namespace - elem összes névtere

rövidítés (kettő megegyezik)

  • child::A/descendant-orself::node()/child::B[position()=1]
  • A//B/*[1]

operátorok

  • aritmetikai: + - / * div mod
  • logikai: and or
  • relációs: = != < <= > >=
  • únió: |

|}

függvények (csak pl)

  • fn:round(num)
  • fn:substring(string,start,len)
  • fn:current-time()

7.4. XSLT sablon

<!-- XSLT hozzárendelése XML-hez -->
<?xml-stylesheet type="text/xsl" href="test1.xsl"?>

<!-- gyökérelemre illesztés -->
<xsl:template match="/">
  ...
  <!-- felsorolás -->
  <xsl:for-each select="neptun/student[average>'3.0']">
	 <!-- rendezés -->
	 <xsl:sort select="name"/>
	 ...
	 <!-- elem érték -->
	 <xsl:value-of select="name"/>
	 <xsl:value-of select="id"/>
  </xsl:for-each>

  <!-- feltétel (nincs else ág)-->
  <xsl:if test="average<2.0">...</xsl:if>

  <!-- többszörös elágazás -->
  <xsl:choose>
	 <xsl:when test="...">...</xsl:when>
	 <xsl:when test="...">...</xsl:when>
	 <xsl:otherwise>...</xsl:otherwise>
  </xsl:choose>
</xsl:template>

<!-- sablon alkalmazása (előzőleg definiálni kell!) -->
<xsl:apply-templates select="id"/> 

7.5. Simple API for XML (SAX)

  • parser alapú, soros feldolgozással
  • állapotfüggetlen
  • eseményvezérelt (Callback pattern!)

org.xml.sax.ContentHandler interfész

  • throws SAXException
  • void startDocument() -> void endDocument()
  • void startElement(String namespaceURI, String sName, String qName, Attributes attrs) -> void endElement()
  • void startPrefixMapping(...) -> void endPrefixMapping(...)
  • void characters(char[] ch, int start, int length)
  • void ignorableWhiteSpace(...)
  • void processingInstruction(...)
  • void skippedEntity(...)
  • void setDocumentLocator(...)
  • üres megvalósítás: org.xml.sax.helpers.DefaultHandler

Locator

  • lekérdezhető vele a parser aktuális pozíciója (sor/oszlop)

hibakezelés

  • fatal error: nem jólformált XML (syntax error)
  • error: nem valid (nem illeszkedik a sémára)
  • warning: egyéb gányság (kétszeres típus)

7.6. Document Object Model (DOM)

7.6.1. DOM általánosan

Document

  • dokumentumot reprezentáló node
  • lekérdezhető adatok: doctype, verzió, kódolás, stb
  • elemeket tud gyártani

Node

  • egy elemet reprezentál
  • lekérdezhető, módosítható adatok: érték, típus, attribútumok
  • navigálás: lefelé (gyerekek), felfelé (szülők), oldalra (testvérek)
  • gyerekeket módosíthatjuk, hozzáadhatunk, elvehetünk

* lekérdezéskor NodeList kollekcióban kapjuk vissza őket

NamedNodeMap

  • Node elérésében segít
  • NamedNodeMap Node.getAttributes()
  • Node get/set/removeNamedItem(String name)
  • Node get/set/removeNamedItemNS(String namespaceURI, String localName)

7.6.2. JDOM

  • Java-s szemléletű DOM API
  • List-et használ NamedNodeMap, NodeList helyett
  • szűrők: org.jdom.filter.Filter
  • XSL támogatás: org.jdom.transform.XSLTranformer
  • XPath: org.jdom.xpath.XPath
  • beolvasás külső segítséggel: DOMBuilder vagy SAXBuilder

-- MeszegetoBalazsIstvan - 2008.05.27.

-- Velias - 2009.05.27.