Commit 5487e168 by Patryk Czarnik

Gotowe przykłady OblugaXML

parent 239fac59
<?xml version="1.0" encoding="utf-8"?>
<aaa>
<ccc>Tekst0</ccc>
<bbb>Tekst1</bbb>
<bbb>Tekst2</bbb>
<bbb>Tekst3</bbb>
</aaa>
<?xml version="1.0" encoding="UTF-8"?>
<!-- Komentarz -->
<rooms>
<room>
<number>2120</number>
<floor>1</floor>
<equipment projector="false" computers="false"/>
<seats>50</seats>
</room>
<room>
<number>3180</number>
<floor>2</floor>
<equipment projector="true" computers="false"/>
<seats>100</seats>
</room>
<room>
<number>3210</number>
<floor>2</floor>
<equipment />
<seats>30</seats>
</room>
<room>
<number>3220</number>
<floor>2</floor>
<equipment />
<seats>30</seats>
</room>
<room>
<number>3230</number>
<floor>2</floor>
<equipment />
<seats>30</seats>
</room>
<room>
<number>4070</number>
<floor>3</floor>
<equipment projector="true" computers="false"/>
<seats>50</seats>
</room>
<room>
<number>4030</number>
<floor>3</floor>
<equipment projector="true" computers="false"/>
<seats>30</seats>
</room>
<room>
<number>4420</number>
<floor>3</floor>
<equipment projector="true" computers="false"/>
<seats>80</seats>
</room>
<room>
<number>5440</number>
<floor>4</floor>
<equipment projector="true" computers="false"/>
<seats>80</seats>
</room>
</rooms>
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="aaa">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="bbb" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="doc">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="aaa"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="aaa">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="bbb" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="doc">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element ref="aaa"/>
<xsd:element ref="bbb"/>
</xsd:choice>
</xsd:complexType>
</xsd:element>
<xsd:element name="aaa">
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:element ref="bbb" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="bbb" type="xsd:string"/>
</xsd:schema>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="bank" type="bank"/>
<xs:complexType name="bank">
<xs:sequence>
<xs:element name="nazwa" type="xs:string" minOccurs="0"/>
<xs:element name="konta" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="konto" type="TKonto" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="TKonto">
<xs:sequence>
<xs:element name="saldo" type="xs:long"/>
<xs:element name="glowny-wlasciciel" type="TOsoba"/>
<xs:element name="drugi-wlasciciel" type="TOsoba" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="numer" type="xs:string" use="required"/>
</xs:complexType>
<xs:complexType name="TOsoba">
<xs:sequence>
<xs:element name="imie" type="xs:string" minOccurs="0"/>
<xs:element name="nazwisko" type="xs:string" minOccurs="0"/>
<xs:element name="ur" type="xs:dateTime" minOccurs="0"/>
<xs:element name="adresZameldowania" type="TAdres" minOccurs="0"/>
<xs:element name="adresKorespondencyjny" type="TAdres" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="plec" type="plec"/>
</xs:complexType>
<xs:complexType name="TAdres">
<xs:sequence>
<xs:element name="ulica" type="xs:string"/>
<xs:element name="nr" type="xs:string"/>
<xs:element name="lokal" type="xs:string" minOccurs="0"/>
<xs:element name="kod-pocztowy" type="xs:string"/>
<xs:element name="miejscowosc" type="xs:string" minOccurs="0"/>
<xs:element name="kraj" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="plec">
<xs:restriction base="xs:string">
<xs:enumeration value="k"/>
<xs:enumeration value="m"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<sklep>
<kategoria id-kategorii="herbata">
<nazwa>Herbata</nazwa>
<opis>Herbata jest dobra.</opis>
</kategoria>
<kategoria id-kategorii="kawa">
<nazwa>Kawa</nazwa>
<opis>Kawa podobno jest niezdrowa ze względu na zawartość <term>kofeiny</term>. Ale wielu ludzi się tym nie przejmuje.</opis>
</kategoria>
<kategoria id-kategorii="czeko">
<nazwa>Czekolada</nazwa>
</kategoria>
<towar id-kategorii="herbata" id-towaru="teekane-gold">
<nazwa>Teekane Gold 80 szt.</nazwa>
<opis>
Opis z <em>wyróżnieniem</em>, <term>pojęciem</term>, <rem>uwagą</rem> oraz <link href="http://pl.wikipedia.org">odnośnikiem</link>.
<br/>
Ten fragment ma być od nowej linii.
</opis>
<cena>12</cena>
<vat>23</vat>
<cena-promocyjna od="2011-11-17" do="2011-11-18">10.99</cena-promocyjna>
</towar>
<towar id-kategorii="czeko" id-towaru="milka-m">
<nazwa>Milka mleczna</nazwa>
<opis>
Niebieskie krowy dają czekoladę. Takie rzeczy tylko w niemieckich Alpach.
</opis>
<cena>2.50</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="herbata" id-towaru="lipton100">
<nazwa>Lipton 100 szt.</nazwa>
<opis>
Herbata w żółtym pudełku <em>mieszczącym 100 sztuk</em>.<br/>
Opłacalny wybór.
</opis>
<cena>12</cena>
<vat>23</vat>
<cena-promocyjna od="2011-11-20" do="2011-11-21">10.99</cena-promocyjna>
<cena-promocyjna od="2011-11-10" do="2011-11-30">10.49</cena-promocyjna>
</towar>
<towar id-kategorii="herbata" id-towaru="lipton25">
<nazwa>Lipton 25 szt.</nazwa>
<opis>
Herbata w żółtym pudełku <em>mieszczącym 25 sztuk</em>.<br/>
<em><rem>Nieco mniej</rem> opłacalny wybór</em>.
</opis>
<cena>6.50</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="kawa" id-towaru="jacobs-k">
<nazwa>Jacobs Krönung</nazwa>
<opis>
Królowa kawy od <link href="http://www.coffeemoose.pl/historia-firmy-jacobs">wielu lat</link>.
</opis>
<cena>21</cena>
<vat>23</vat>
<cena-promocyjna od="2011-11-18" do="2011-04-18">16</cena-promocyjna>
</towar>
<towar id-kategorii="herbata" id-towaru="dilmah">
<nazwa>Dilmah black tea</nazwa>
<opis>
Czarna herbata Dilmah. Klasyka smaku.
</opis>
<cena>16</cena>
<vat>23</vat>
<cena-promocyjna od="2011-11-12" do="2011-11-21">17</cena-promocyjna>
</towar>
<towar id-kategorii="kawa" id-towaru="tchibo">
<nazwa>Tchibo Family</nazwa>
<opis>
Ulubiona kawa rodzinna.<br/>
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
</opis>
<cena>19</cena>
<vat>23</vat>
<cena-promocyjna od="2011-11-20" do="2011-11-21">16</cena-promocyjna>
</towar>
<towar id-kategorii="czeko" id-towaru="wedel-g">
<nazwa>Wedel gorzka</nazwa>
<opis>
Czekolada gorzka i twarda.<br/>
<rem>Uwaga na zęby</rem>
</opis>
<cena>2.20</cena>
<vat>23</vat>
<cena-promocyjna od="2011-11-14" do="2011-11-18">2.00</cena-promocyjna>
</towar>
<towar id-kategorii="czeko" id-towaru="wedel-m">
<nazwa>Wedel mleczna</nazwa>
<opis>
Jeśli ktoś lubi bardziej na słodko, czekolada mleczna będzie OK.
</opis>
<cena>2.20</cena>
<vat>23</vat>
<cena-promocyjna od="2011-11-20" do="2011-11-23">2.00</cena-promocyjna>
</towar>
<towar id-kategorii="herbata" id-towaru="ahmad">
<nazwa>Ahmad Tea</nazwa>
<opis>
Mocna czarna herbata dla wybrednych.
</opis>
<cena>13</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="herbata" id-towaru="saga">
<nazwa>Saga</nazwa>
<opis>
Tania herbata dla oszczędnych. <rem>Jednak nie tak tania jak produkty w Biedronce.</rem>
</opis>
<cena>13</cena>
<vat>23</vat>
</towar>
</sklep>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="sklep"> <!-- asortyment sklepu -->
<xs:complexType>
<xs:sequence>
<xs:element name="kategoria" type="TKategoria" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="towar" type="TTowar" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:key name="KKategorieWSklepie">
<xs:selector xpath="kategoria"/>
<xs:field xpath="@id-kategorii"/>
</xs:key>
<xs:key name="KTowaryWSklepie">
<xs:selector xpath="towar"/>
<xs:field xpath="@id-towaru"/>
</xs:key>
<xs:keyref name="KKategorieZTowarow" refer="KKategorieWSklepie">
<xs:selector xpath="towar"/>
<xs:field xpath="@id-kategorii"/>
</xs:keyref>
</xs:element>
<xs:element name="cenniki"> <!-- zbiór cenników z różnych (w założeniu kolejnych) dat -->
<xs:complexType>
<xs:sequence>
<xs:element ref="cennik" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="KDatyWCennikach">
<xs:selector xpath="cennik"/>
<xs:field xpath="data"/>
</xs:unique>
</xs:element>
<xs:element name="cennik"> <!-- cennik z jednego dnia -->
<xs:complexType>
<xs:sequence>
<xs:element name="data" type="xs:date"/>
<xs:element name="towar" type="TTowar" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="KTowaryWCenniku">
<xs:selector xpath="towar"/>
<xs:field xpath="@id-towaru"/>
</xs:unique>
</xs:element>
<xs:complexType name="TKategoria">
<xs:sequence>
<xs:element name="nazwa" type="TNazwa"/>
<xs:element name="opis" type="TTekst" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="id-kategorii" type="TId" use="required"/>
</xs:complexType>
<xs:complexType name="TTowar">
<xs:sequence>
<xs:element name="nazwa" type="TNazwa"/>
<xs:element name="opis" type="TTekst" minOccurs="0"/>
<xs:element name="cena" type="TKwota"/>
<xs:element name="vat" type="TVat"/>
<xs:element name="cena-promocyjna" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="TKwota">
<xs:attributeGroup ref="APrzedział"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id-towaru" type="TId" use="required"/>
<xs:attribute name="id-kategorii" type="TId"/>
</xs:complexType>
<xs:complexType name="TTekst" mixed="true">
<xs:group ref="GElementyTekstu" minOccurs="0" maxOccurs="unbounded"/>
</xs:complexType>
<xs:group name="GElementyTekstu">
<xs:choice>
<xs:element name="em" type="TTekst"/>
<xs:element name="rem" type="TTekst"/>
<xs:element name="term" type="TTekst"/>
<xs:element name="br">
<xs:complexType/>
</xs:element>
<xs:element name="link">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="href" type="xs:anyURI" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:group>
<xs:attributeGroup name="APrzedział">
<xs:attribute name="od" type="xs:date" use="required"/>
<xs:attribute name="do" type="xs:date" use="required"/>
</xs:attributeGroup>
<xs:simpleType name="TKwota">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0"/>
<xs:fractionDigits value="2"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TVat">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="100"/>
<xs:fractionDigits value="0"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TNazwa">
<xs:restriction base="xs:token">
<xs:minLength value="1"/>
<xs:maxLength value="120"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TId">
<xs:restriction base="xs:token">
<xs:minLength value="1"/>
<xs:maxLength value="32"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="kategoria"/>
<xsl:output method="html" encoding="utf-8"/>
<xsl:decimal-format
decimal-separator=","
grouping-separator=" "/>
<!-- Szablon dla korzenia, uruchamiany jako pierwszy -->
<xsl:template match="/">
<html>
<head>
<title>Sklep <xsl:value-of select="$kategoria"/></title>
<style type="text/css">
body { background-color: #DDDDDD}
.kat {background-color: #DDFFFF}
.tow { background-color: #FFFFDD}
.tow, .kat {
border: 2px outset #665500;
margin: 1em auto;
padding: 0.5em;
width: 400px;
}
h2 {
margin: 0 0 0.5em 0;
}
strong { color: red }
</style>
</head>
<body>
<xsl:apply-templates select="(sklep/kategoria | sklep/towar)
[@id-kategorii = $kategoria or not($kategoria)]"/>
</body>
</html>
</xsl:template>
<xsl:template match="kategoria">
<div class="kat" id="K{@id-kategorii}">
<xsl:apply-templates select="nazwa"/>
<xsl:apply-templates select="opis"/>
<xsl:for-each select="//towar[@id-kategorii = current()/@id-kategorii]">
<a href="#T{@id-towaru}">
<xsl:value-of select="nazwa"/>
</a>
<xsl:if test="position() != last()">, </xsl:if>
</xsl:for-each>
</div>
</xsl:template>
<xsl:template match="towar">
<div class="tow" id="T{@id-towaru}">
<!-- Sami nadajemy kolejność wypisywanym elementom -->
<xsl:apply-templates select="nazwa"/>
<xsl:variable name="moja-kategoria" select="@id-kategorii"/>
<a href="#K{@id-kategorii}">
<xsl:value-of select="//kategoria[@id-kategorii = $moja-kategoria]/nazwa"/>
</a>
<!-- Albo bez zmiennej:
<xsl:value-of select="//kategoria[@id-kategorii = current()/@id-kategorii]/nazwa"/> -->
<br/>
Cena netto:
<xsl:call-template name="kwota">
<xsl:with-param name="wartość" select="cena"/>
</xsl:call-template>
<br />
Cena brutto:
<xsl:call-template name="kwota">
<xsl:with-param name="wartość" select="cena * (1 + vat div 100)"/>
</xsl:call-template>
<xsl:apply-templates select="opis"/>
</div>
</xsl:template>
<xsl:template match="nazwa">
<h2><xsl:apply-templates/></h2>
</xsl:template>
<xsl:template match="opis">
<p><xsl:apply-templates/></p>
</xsl:template>
<xsl:template match="em">
<strong><xsl:apply-templates/></strong>
</xsl:template>
<xsl:template match="term">
<dfn><xsl:apply-templates/></dfn>
</xsl:template>
<xsl:template match="link">
<a href="{@href}"><xsl:apply-templates/></a>
</xsl:template>
<xsl:template match="br">
<br/>
</xsl:template>
<xsl:template name="kwota">
<xsl:param name="wartość"/>
<xsl:value-of select="format-number($wartość, '0,00')"/>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="kategoria" />
<xsl:template match="/*">
<xsl:copy>
<xsl:copy-of select="kategoria[@id-kategorii = $kategoria or not($kategoria)]"/>
<xsl:copy-of select="towar[@id-kategorii = $kategoria or not($kategoria)]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8"/>
<xsl:param name="kategoria" />
<xsl:decimal-format name="format-polski"
decimal-separator=","
grouping-separator=" "/>
<xsl:template match="/">
<html>
<head>
<title>Sklep</title>
<style type="text/css">
.towar, .kategoria {
display: block;
margin: 1em;
padding: 0.5em;
border-style: solid;
border-with: 2px;
}
.towar {
border-color: green;
}
.kategoria {
border-color: red;
}
h2 {
font-size: 1.2em;
font-family: 'Arial', sans-serif;
margin: 0 0 0.75em 0;
}
.kategoria h2 {
font-style: italic;
font-weight: normal;
}
.towar h2 {
font-style: normal;
font-weight: bold;
}
dfn {
font-weight: bold;
font-style: normal;
}
span.rem {
color: #888888;
}
</style>
</head>
<body>
Towary z kategorii: <xsl:value-of select="$kategoria"/>
<xsl:apply-templates select="/sklep/kategoria[@id-kategorii = $kategoria or not($kategoria)]"/>
<xsl:apply-templates select="/sklep/towar[@id-kategorii = $kategoria or not($kategoria)]"/>
</body>
</html>
</xsl:template>
<xsl:template match="kategoria">
<div class="kategoria" id="K-{@id-kategorii}">
<xsl:apply-templates select="nazwa"/>
<xsl:apply-templates select="opis"/>
<p>Towary:
<xsl:for-each select="/sklep/towar[@id-kategorii = current()/@id-kategorii]">
<a href="#T-{@id-towaru}"><xsl:value-of select="nazwa"/></a>
<xsl:if test="position() != last()">, </xsl:if>
</xsl:for-each>
</p>
</div>
</xsl:template>
<xsl:template match="towar">
<div class="towar" id="T-{@id-towaru}">
<xsl:apply-templates select="nazwa"/>
Kategoria:
<a href="#K-{@id-kategorii}">
<xsl:value-of select="/sklep/kategoria[@id-kategorii = current()/@id-kategorii]/nazwa"/>
</a>
<p>
<xsl:if test="cena-promocyjna">
PROMOCJA<br/>
</xsl:if>
Cena netto: <xsl:value-of select="format-number(cena, '0,00', 'format-polski')"/>
<br/>
Cena brutto: <xsl:value-of select="format-number(cena-brutto, '0,00', 'format-polski')"/>
</p>
<xsl:apply-templates select="opis"/>
</div>
</xsl:template>
<xsl:template match="nazwa">
<h2>
<xsl:apply-templates />
</h2>
</xsl:template>
<xsl:template match="opis">
<p>
<xsl:apply-templates />
</p>
</xsl:template>
<xsl:template match="term">
<dfn>
<xsl:apply-templates />
</dfn>
</xsl:template>
<xsl:template match="em">
<em>
<xsl:apply-templates />
</em>
</xsl:template>
<xsl:template match="rem">
<span class="rem">
<xsl:apply-templates />
</span>
</xsl:template>
<xsl:template match="link">
<a href="{@href}">
<xsl:apply-templates />
</a>
</xsl:template>
</xsl:stylesheet>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:s="urn:sklep">
<xsl:output method="html" encoding="UTF-8"/>
<xsl:param name="kategoria" />
<xsl:decimal-format name="format-polski"
decimal-separator=","
grouping-separator=" "/>
<xsl:template match="/">
<html>
<head>
<title>Sklep</title>
<style type="text/css">
.towar, .kategoria {
display: block;
margin: 1em;
padding: 0.5em;
border-style: solid;
border-with: 2px;
}
.towar {
border-color: green;
}
.kategoria {
border-color: red;
}
h2 {
font-size: 1.2em;
font-family: 'Arial', sans-serif;
margin: 0 0 0.75em 0;
}
.kategoria h2 {
font-style: italic;
font-weight: normal;
}
.towar h2 {
font-style: normal;
font-weight: bold;
}
dfn {
font-weight: bold;
font-style: normal;
}
span.rem {
color: #888888;
}
</style>
</head>
<body>
Towary z kategorii: <xsl:value-of select="$kategoria"/>
<xsl:apply-templates select="/s:sklep/s:kategoria[@id-kategorii = $kategoria or not($kategoria)]"/>
<xsl:apply-templates select="/s:sklep/s:towar[@id-kategorii = $kategoria or not($kategoria)]"/>
</body>
</html>
</xsl:template>
<xsl:template match="s:kategoria">
<div class="kategoria" id="K-{@id-kategorii}">
<xsl:apply-templates select="s:nazwa"/>
<xsl:apply-templates select="s:opis"/>
<p>Towary:
<xsl:for-each select="/s:sklep/s:towar[@id-kategorii = current()/@id-kategorii]">
<a href="#T-{@id-towaru}"><xsl:value-of select="s:nazwa"/></a>
<xsl:if test="position() != last()">, </xsl:if>
</xsl:for-each>
</p>
</div>
</xsl:template>
<xsl:template match="s:towar">
<div class="towar" id="T-{@id-towaru}">
<xsl:apply-templates select="s:nazwa"/>
Kategoria:
<a href="#K-{@id-kategorii}">
<xsl:value-of select="/s:sklep/s:kategoria[@id-kategorii = current()/@id-kategorii]/s:nazwa"/>
</a>
<p>
Cena netto: <xsl:value-of select="format-number(s:cena, '0,00', 'format-polski')"/>
<br/>
Cena brutto: <xsl:value-of select="format-number(s:cena-brutto, '0,00', 'format-polski')"/>
</p>
<xsl:apply-templates select="s:opis"/>
</div>
</xsl:template>
<xsl:template match="s:nazwa">
<h2>
<xsl:apply-templates />
</h2>
</xsl:template>
<xsl:template match="s:opis">
<p>
<xsl:apply-templates />
</p>
</xsl:template>
<xsl:template match="s:term">
<dfn>
<xsl:apply-templates />
</dfn>
</xsl:template>
<xsl:template match="s:em">
<em>
<xsl:apply-templates />
</em>
</xsl:template>
<xsl:template match="s:rem">
<span class="rem">
<xsl:apply-templates />
</span>
</xsl:template>
<xsl:template match="s:link">
<a href="{@href}">
<xsl:apply-templates />
</a>
</xsl:template>
</xsl:stylesheet>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<sklep xmlns="urn:sklep" xmlns:pre="urn:sklep"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:sklep sklep_ns.xsd">
<kategoria id-kategorii="herbata">
<nazwa>Herbata</nazwa>
<opis>Herbata jest dobra.</opis>
</kategoria>
<pre:kategoria id-kategorii="kawa">
<nazwa>Kawa</nazwa>
<opis>Kawa podobno jest niezdrowa ze względu na zawartość <term>kofeiny</term>. Ale wielu ludzi się tym nie przejmuje.</opis>
</pre:kategoria>
<kategoria id-kategorii="czeko">
<nazwa>Czekolada</nazwa>
</kategoria>
<towar id-kategorii="herbata" id-towaru="teekane-gold">
<nazwa>Teekane Gold 80 szt.</nazwa>
<opis>
Opis z <em>wyróżnieniem</em>, <term>ważnym pojęciem</term>, <rem>uwagą</rem> oraz <link href="http://pl.wikipedia.org">odnośnikiem</link>.
<br/>
Ten fragment ma być od nowej linii (albo w następnym akapicie...).
</opis>
<pre:cena>12</pre:cena>
<vat>23</vat>
<cena-promocyjna od="2011-04-20" do="2011-04-21">10.99</cena-promocyjna>
</towar>
<towar id-kategorii="czeko" id-towaru="milka-m">
<nazwa>Milka mleczna</nazwa>
<opis>
Niebieskie krowy produkują czekoladę. Takie rzeczy tylko w niemieckich (?) Alpach.
</opis>
<cena>2.50</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="herbata" id-towaru="lipton100">
<nazwa>Lipton 100 szt.</nazwa>
<opis>
Herbata w żółtym pudełku <em>mieszczącym 100 sztuk</em>.<br/>
Opłacalny wybór.
</opis>
<cena>12</cena>
<vat>23</vat>
<cena-promocyjna od="2011-04-20" do="2011-04-21">10.99</cena-promocyjna>
<cena-promocyjna od="2011-04-21" do="2011-04-25">10.49</cena-promocyjna>
</towar>
<towar id-kategorii="herbata" id-towaru="lipton25">
<nazwa>Lipton 25 szt.</nazwa>
<opis>
Herbata w żółtym pudełku <em>mieszczącym 25 sztuk</em>.<br/>
<em><rem>Nieco mniej</rem> opłacalny wybór</em>.
</opis>
<cena>6.50</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="kawa" id-towaru="jacobs-k">
<nazwa>Jacobs Krönung</nazwa>
<opis>
Królowa kawy od <link href="http://www.coffeemoose.pl/historia-firmy-jacobs">wielu lat</link>.
</opis>
<cena>21</cena>
<vat>23</vat>
<cena-promocyjna od="2011-04-20" do="2011-04-21">16</cena-promocyjna>
</towar>
<towar id-kategorii="herbata" id-towaru="dilmah">
<nazwa>Dilmah black tea</nazwa>
<opis>
Czarna herbata Dilmah. Klasyka smaku.
</opis>
<cena>16</cena>
<vat>23</vat>
<cena-promocyjna od="2011-04-20" do="2011-04-21">17</cena-promocyjna>
</towar>
<towar id-kategorii="kawa" id-towaru="tchibo">
<nazwa>Tchibo Family</nazwa>
<opis>
Ulubiona kawa rodzinna.<br/>
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
Ala ma kota a Ola ma psa. Ala z Olą lubią się jak pies z kotem.
</opis>
<cena>19</cena>
<vat>23</vat>
<cena-promocyjna od="2011-04-20" do="2011-04-21">16</cena-promocyjna>
</towar>
<towar id-kategorii="czeko" id-towaru="wedel-g">
<nazwa>Wedel gorzka</nazwa>
<opis>
Czekolada gorzka i twarda.<br/>
<rem>Uwaga na zęby</rem>
</opis>
<cena>2.20</cena>
<vat>23</vat>
<cena-promocyjna od="2011-04-21" do="2011-04-23">2.00</cena-promocyjna>
</towar>
<towar id-kategorii="czeko" id-towaru="wedel-m">
<nazwa>Wedel mleczna</nazwa>
<opis>
Jeśli ktoś lubi bardziej na słodko, czekolada mleczna będzie OK.
</opis>
<cena>2.20</cena>
<vat>23</vat>
<cena-promocyjna od="2011-04-21" do="2011-04-23">2.00</cena-promocyjna>
</towar>
<towar id-kategorii="herbata" id-towaru="ahmad">
<nazwa>Ahmad Tea</nazwa>
<opis>
Mocna czarna herbata dla wybrednych.
</opis>
<cena>13</cena>
<vat>23</vat>
</towar>
<towar id-kategorii="herbata" id-towaru="saga">
<nazwa>Saga</nazwa>
<opis>
Tania herbata dla oszczędnych. <rem>Jednak nie tak tania jak produkty w Biedronce.</rem>
</opis>
<cena>13</cena>
<vat>23</vat>
</towar>
</sklep>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
targetNamespace="urn:sklep" xmlns:tns="urn:sklep">
<xs:element name="sklep"> <!-- asortyment sklepu -->
<xs:complexType>
<xs:sequence>
<xs:element name="kategoria" type="tns:TKategoria" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="towar" type="tns:TTowar" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:key name="KKategorieWSklepie">
<xs:selector xpath="tns:kategoria"/>
<xs:field xpath="@id-kategorii"/>
</xs:key>
<xs:key name="KTowaryWSklepie">
<xs:selector xpath="tns:towar"/>
<xs:field xpath="@id-towaru"/>
</xs:key>
<xs:keyref name="KKategorieZTowarow" refer="tns:KKategorieWSklepie">
<xs:selector xpath="tns:towar"/>
<xs:field xpath="@id-kategorii"/>
</xs:keyref>
</xs:element>
<xs:element name="cenniki"> <!-- zbiór cenników z różnych (w założeniu kolejnych) dat -->
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:cennik" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="KDatyWCennikach">
<xs:selector xpath="tns:cennik"/>
<xs:field xpath="tns:data"/>
</xs:unique>
</xs:element>
<xs:element name="cennik"> <!-- cennik z jednego dnia -->
<xs:complexType>
<xs:sequence>
<xs:element name="data" type="xs:date"/>
<xs:element name="towar" type="tns:TTowar" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="KTowaryWCenniku">
<xs:selector xpath="tns:towar"/>
<xs:field xpath="@id-towaru"/>
</xs:unique>
</xs:element>
<xs:complexType name="TKategoria">
<xs:sequence>
<xs:element name="nazwa" type="tns:TNazwa"/>
<xs:element name="opis" type="tns:TTekst" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="id-kategorii" type="tns:TId" use="required"/>
</xs:complexType>
<xs:complexType name="TTowar">
<xs:sequence>
<xs:element name="nazwa" type="tns:TNazwa"/>
<xs:element name="opis" type="tns:TTekst" minOccurs="0"/>
<xs:element name="cena" type="tns:TKwota"/>
<xs:element name="cena-brutto" type="tns:TKwota" minOccurs="0"/>
<xs:element name="vat" type="tns:TVat"/>
<xs:element name="cena-promocyjna" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="tns:TKwota">
<xs:attributeGroup ref="tns:APrzedział"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id-towaru" type="tns:TId" use="required"/>
<xs:attribute name="id-kategorii" type="tns:TId"/>
</xs:complexType>
<xs:complexType name="TTekst" mixed="true">
<xs:group ref="tns:GElementyTekstu" minOccurs="0" maxOccurs="unbounded"/>
</xs:complexType>
<xs:group name="GElementyTekstu">
<xs:choice>
<xs:element name="em" type="tns:TTekst"/>
<xs:element name="rem" type="tns:TTekst"/>
<xs:element name="term" type="tns:TTekst"/>
<xs:element name="br">
<xs:complexType/>
</xs:element>
<xs:element name="link">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="href" type="xs:anyURI" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:group>
<xs:attributeGroup name="APrzedział">
<xs:attribute name="od" type="xs:date" use="required"/>
<xs:attribute name="do" type="xs:date" use="required"/>
</xs:attributeGroup>
<xs:simpleType name="TKwota">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0"/>
<xs:fractionDigits value="2"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TVat">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="100"/>
<xs:fractionDigits value="0"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TNazwa">
<xs:restriction base="xs:token">
<xs:minLength value="1"/>
<xs:maxLength value="120"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TId">
<xs:restriction base="xs:token">
<xs:minLength value="1"/>
<xs:maxLength value="32"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
\ No newline at end of file
<!ELEMENT wyniki (wynik*)>
<!ELEMENT wynik EMPTY>
<!ATTLIST wynik haslo CDATA #REQUIRED
liczba CDATA #REQUIRED>
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -14,4 +14,18 @@ ...@@ -14,4 +14,18 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> </properties>
<dependencies>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>4.0.3</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</project> </project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<jxb:bindings version="2.0"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sk="urn:sklep"
xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb bindingschema_2_0.xsd">
</jxb:bindings>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
targetNamespace="urn:sklep"
xmlns:tns="urn:sklep"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xsi:schemaLocation="http://www.w3.org/2001/XMLSchema XMLSchema.xsd http://java.sun.com/xml/ns/jaxb bindingschema_2_0.xsd"
jxb:version="2.0">
<xs:element name="sklep"> <!-- asortyment sklepu -->
<xs:complexType>
<xs:sequence>
<xs:element name="kategoria" type="tns:TKategoria" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:appinfo>
<jxb:property name="kategorie">
<jxb:javadoc>Lista kategorii dostępnych w sklepie.</jxb:javadoc>
</jxb:property>
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="towar" type="tns:TTowar" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:appinfo>
<jxb:property name="towary"></jxb:property>
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:key name="KKategorieWSklepie">
<xs:selector xpath="tns:kategoria"/>
<xs:field xpath="@id-kategorii"/>
</xs:key>
<xs:key name="KTowaryWSklepie">
<xs:selector xpath="tns:towar"/>
<xs:field xpath="@id-towaru"/>
</xs:key>
<xs:keyref name="KKategorieZTowarow" refer="tns:KKategorieWSklepie">
<xs:selector xpath="tns:towar"/>
<xs:field xpath="@id-kategorii"/>
</xs:keyref>
</xs:element>
<xs:element name="cenniki"> <!-- zbiór cenników z różnych (w założeniu kolejnych) dat -->
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:cennik" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="KDatyWCennikach">
<xs:selector xpath="tns:cennik"/>
<xs:field xpath="tns:data"/>
</xs:unique>
</xs:element>
<xs:element name="cennik"> <!-- cennik z jednego dnia -->
<xs:complexType>
<xs:sequence>
<xs:element name="data" type="xs:date"/>
<xs:element name="towar" type="tns:TTowar" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="KTowaryWCenniku">
<xs:selector xpath="tns:towar"/>
<xs:field xpath="@id-towaru"/>
</xs:unique>
</xs:element>
<xs:complexType name="TKategoria">
<xs:sequence>
<xs:element name="nazwa" type="tns:TNazwa"/>
<xs:element name="opis" type="tns:TTekst" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="id-kategorii" type="tns:TId" use="required"/>
</xs:complexType>
<xs:complexType name="TTowar">
<xs:annotation>
<xs:appinfo>
<jxb:class name="Towar">
<jxb:javadoc>Obiekt tej klasy reprezentuje pojedynczy towar w sklepie.</jxb:javadoc>
</jxb:class>
</xs:appinfo>
</xs:annotation>
<xs:sequence>
<xs:element name="nazwa" type="tns:TNazwa"/>
<xs:element name="opis" type="tns:TTekst" minOccurs="0"/>
<xs:element name="cena" type="tns:TKwota">
<xs:annotation>
<xs:appinfo>
<jxb:property name="cenaNetto"></jxb:property>
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="vat" type="tns:TVat">
<xs:annotation>
<xs:appinfo>
<jxb:property name="podatekVat"></jxb:property>
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="cena-promocyjna" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="tns:TKwota">
<xs:attributeGroup ref="tns:APrzedział"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id-towaru" type="tns:TId" use="required"/>
<xs:attribute name="id-kategorii" type="tns:TId"/>
</xs:complexType>
<xs:complexType name="TTekst" mixed="true">
<xs:group ref="tns:GElementyTekstu" minOccurs="0" maxOccurs="unbounded"/>
</xs:complexType>
<xs:group name="GElementyTekstu">
<xs:choice>
<xs:element name="em" type="tns:TTekst"/>
<xs:element name="rem" type="tns:TTekst"/>
<xs:element name="term" type="tns:TTekst"/>
<xs:element name="br">
<xs:complexType/>
</xs:element>
<xs:element name="link">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="href" type="xs:anyURI" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:group>
<xs:attributeGroup name="APrzedział">
<xs:attribute name="od" type="xs:date" use="required"/>
<xs:attribute name="do" type="xs:date" use="required"/>
</xs:attributeGroup>
<xs:simpleType name="TKwota">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0"/>
<xs:fractionDigits value="2"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TVat">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="100"/>
<xs:fractionDigits value="0"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TNazwa">
<xs:restriction base="xs:token">
<xs:minLength value="1"/>
<xs:maxLength value="120"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TId">
<xs:restriction base="xs:token">
<xs:minLength value="1"/>
<xs:maxLength value="32"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<jxb:bindings version="2.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sk="urn:sklep" xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb bindingschema_2_0.xsd">
<jxb:globalBindings>
<jxb:javaType xmlType="sk:TKwota" name="int"
parseMethod="zad13.Tlumacz.parse" printMethod="zad13.Tlumacz.print"/>
</jxb:globalBindings>
<jxb:bindings schemaLocation="sklep_ns.xsd" node="/xs:schema">
<jxb:schemaBindings>
<jxb:package name="zad13.sklep">
<jxb:javadoc>Pakiet wygenerowany z JAXB na podstawie schematu do sklepu.</jxb:javadoc>
</jxb:package>
</jxb:schemaBindings>
<jxb:bindings node="xs:element[@name='sklep']">
<jxb:bindings node=".//xs:element[@name='kategoria']">
<jxb:property name="kategorie">
<jxb:javadoc>Lista kategorii dostępnych w sklepie.</jxb:javadoc>
</jxb:property>
</jxb:bindings>
<jxb:bindings node=".//xs:element[@name='towar']">
<jxb:property name="towary">
<jxb:javadoc>Lista towarów dostępnych w sklepie.</jxb:javadoc>
</jxb:property>
</jxb:bindings>
</jxb:bindings>
<jxb:bindings node="xs:complexType[@name='TTowar']">
<jxb:class name="Towar">
<jxb:javadoc>Obiekt tej klasy reprezentuje pojedynczy towar w sklepie.</jxb:javadoc>
</jxb:class>
<jxb:bindings node=".//xs:element[@name='cena']">
<jxb:property name="cenaNetto"/>
</jxb:bindings>
<jxb:bindings node=".//xs:element[@name='vat']">
<jxb:property name="stawkaVat"/>
</jxb:bindings>
<jxb:bindings node=".//xs:element[@name='opis']">
<jxb:property generateIsSetMethod="true"/>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
<?xml version="1.0" encoding="UTF-8"?>
<jxb:bindings version="2.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sk="urn:sklep" xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb bindingschema_2_0.xsd">
<jxb:bindings schemaLocation="sklep_ns.xsd" node="/xs:schema">
<jxb:schemaBindings>
<jxb:package name="zad13.sklep">
<jxb:javadoc>Pakiet wygenerowany z JAXB na podstawie schematu do sklepu.</jxb:javadoc>
</jxb:package>
</jxb:schemaBindings>
</jxb:bindings>
<jxb:bindings schemaLocation="sklep_ns.xsd"
node="//xs:element[@name='sklep']//xs:element[@name='kategoria']">
<jxb:property name="kategorie">
<jxb:javadoc>Lista kategorii dostępnych w sklepie.</jxb:javadoc>
</jxb:property>
</jxb:bindings>
<jxb:bindings schemaLocation="sklep_ns.xsd"
node="//xs:element[@name='sklep']//xs:element[@name='towar']">
<jxb:property name="towary">
<jxb:javadoc>Lista towarów dostępnych w sklepie.</jxb:javadoc>
</jxb:property>
</jxb:bindings>
</jxb:bindings>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
targetNamespace="urn:sklep"
xmlns:tns="urn:sklep">
<xs:element name="sklep"> <!-- asortyment sklepu -->
<xs:complexType>
<xs:sequence>
<xs:element name="kategoria" type="tns:TKategoria" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="towar" type="tns:TTowar" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:key name="KKategorieWSklepie">
<xs:selector xpath="tns:kategoria"/>
<xs:field xpath="@id-kategorii"/>
</xs:key>
<xs:key name="KTowaryWSklepie">
<xs:selector xpath="tns:towar"/>
<xs:field xpath="@id-towaru"/>
</xs:key>
<xs:keyref name="KKategorieZTowarow" refer="tns:KKategorieWSklepie">
<xs:selector xpath="tns:towar"/>
<xs:field xpath="@id-kategorii"/>
</xs:keyref>
</xs:element>
<xs:element name="cenniki"> <!-- zbiór cenników z różnych (w założeniu kolejnych) dat -->
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:cennik" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="KDatyWCennikach">
<xs:selector xpath="tns:cennik"/>
<xs:field xpath="tns:data"/>
</xs:unique>
</xs:element>
<xs:element name="cennik"> <!-- cennik z jednego dnia -->
<xs:complexType>
<xs:sequence>
<xs:element name="data" type="xs:date"/>
<xs:element name="towar" type="tns:TTowar" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="KTowaryWCenniku">
<xs:selector xpath="tns:towar"/>
<xs:field xpath="@id-towaru"/>
</xs:unique>
</xs:element>
<xs:complexType name="TKategoria">
<xs:sequence>
<xs:element name="nazwa" type="tns:TNazwa"/>
<xs:element name="opis" type="tns:TTekst" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="id-kategorii" type="tns:TId" use="required"/>
</xs:complexType>
<xs:complexType name="TTowar">
<xs:sequence>
<xs:element name="nazwa" type="tns:TNazwa"/>
<xs:element name="opis" type="tns:TTekst" minOccurs="0"/>
<xs:element name="cena" type="tns:TKwota"/>
<xs:element name="vat" type="tns:TVat"/>
<xs:element name="cena-promocyjna" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="tns:TKwota">
<xs:attributeGroup ref="tns:APrzedział"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id-towaru" type="tns:TId" use="required"/>
<xs:attribute name="id-kategorii" type="tns:TId"/>
</xs:complexType>
<xs:complexType name="TTekst" mixed="true">
<xs:group ref="tns:GElementyTekstu" minOccurs="0" maxOccurs="unbounded"/>
</xs:complexType>
<xs:group name="GElementyTekstu">
<xs:choice>
<xs:element name="em" type="tns:TTekst"/>
<xs:element name="rem" type="tns:TTekst"/>
<xs:element name="term" type="tns:TTekst"/>
<xs:element name="br">
<xs:complexType/>
</xs:element>
<xs:element name="link">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="href" type="xs:anyURI" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:group>
<xs:attributeGroup name="APrzedział">
<xs:attribute name="od" type="xs:date" use="required"/>
<xs:attribute name="do" type="xs:date" use="required"/>
</xs:attributeGroup>
<xs:simpleType name="TKwota">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0"/>
<xs:fractionDigits value="2"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TVat">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="100"/>
<xs:fractionDigits value="0"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TNazwa">
<xs:restriction base="xs:token">
<xs:minLength value="1"/>
<xs:maxLength value="120"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TId">
<xs:restriction base="xs:token">
<xs:minLength value="1"/>
<xs:maxLength value="32"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
\ No newline at end of file
package common;
import java.util.Arrays;
public class Args {
public static String[] argsOrDefault(String[] args, String... defaults) {
int length = Math.max(args.length, defaults.length);
String[] newArgs = Arrays.copyOf(args, length);
for(int i = 0; i < defaults.length; i++) {
if(newArgs[i] == null) {
newArgs[i] = defaults[i];
}
}
return newArgs;
}
}
package common;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
/**Przyklad ContentHandlera.
* Informuje o niektorych zdarzeniach SAX wypisujac tekst na standardowe wyjscie.
* @author Patryk Czarnik
*/
public class InfoHandler extends DefaultHandler {
/**Domyslny konstruktor. */
public InfoHandler() {
super();
}
/* Metody interfejsu ContentHandler: */
/**Informuje o zdarzeniu "wezel tekstowy".
* @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
*/
@Override
public void characters(char[] aCh, int aStart, int aLength) throws SAXException {
/* obcinamy napis jesli bylby za dlugi do wypisania */
aLength = (aLength <= 512) ? aLength : 512;
String napis = new String(aCh, aStart, aLength);
System.out.print("CHARACTERS: ");
System.out.println(napis);
}
/**Informuje o zdarzeniu "pocztaek elementu".
* @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
*/
@Override
public void startElement(String aUri, String aLocalName, String aName, Attributes aAttributes) throws SAXException {
System.out.println("START_ELEMENT qName="+aName+" URI="+aUri+" localName="+aLocalName
+" attributes: "+aAttributes.getLength());
}
/**Informuje o zdarzeniu "koniec elementu".
* @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
*/
@Override
public void endElement(String aUri, String aLocalName, String aName) throws SAXException {
System.out.println("END_ELEMENT qName="+aName+" URI="+aUri+" localName="+aLocalName);
}
/* Metody interfejsu ErrorHandler: */
/**Informuje o zwyklym bledzie.
* @see org.xml.sax.helpers.DefaultHandler#error(org.xml.sax.SAXParseException)
*/
@Override
public void error(SAXParseException e) throws SAXException {
System.err.println("ERROR: "+e.getMessage());
}
/**Informuje o powaznym bledzie.
* @see org.xml.sax.helpers.DefaultHandler#fatalError(org.xml.sax.SAXParseException)
*/
@Override
public void fatalError(SAXParseException e) throws SAXException {
System.err.println("FATAL_ERROR: "+e.getMessage());
}
/**Informuje o ostrzezeniu.
* @see org.xml.sax.helpers.DefaultHandler#warning(org.xml.sax.SAXParseException)
*/
@Override
public void warning(SAXParseException e) throws SAXException {
System.err.println("WARNING: "+e.getMessage());
}
}
package common;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
public class MojBrutalnyErrorHandler implements ErrorHandler {
@Override
public void warning(SAXParseException exception) throws SAXException {
System.err.println("![WARNING] "+exception.getMessage());
}
@Override
public void error(SAXParseException exception) throws SAXException {
System.err.println("![ERROR] "+exception.getMessage());
throw new SAXException("Blad walidacji.", exception);
}
@Override
public void fatalError(SAXParseException exception) throws SAXException {
System.err.println("![FATAL ERROR] "+exception.getMessage());
throw new SAXException("Blad ostateczny.", exception);
}
}
package walidacja; package common;
import org.xml.sax.ErrorHandler; import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
......
package common;
import java.util.Map;
import java.util.TreeMap;
public class Statystyki {
TreeMap<String, Integer> elementy = new TreeMap<>();
int dlugoscTekstow = 0;
int maxGlebokosc = 0;
public String wypisz() {
StringBuilder buf = new StringBuilder();
buf.append("Statystyki\n");
buf.append("Elementy:\n");
for(Map.Entry<String, Integer> wpis : elementy.entrySet()) {
buf.append(" ").append(wpis.getKey()).append(" - ").append(wpis.getValue()).append('\n');
}
buf.append("Dlugosc tekstow: ").append(dlugoscTekstow).append('\n');
buf.append("Maksymalna glebokosc: ").append(maxGlebokosc).append('\n');
return buf.toString();
}
public void dodajElement(String nazwa) {
Integer staraWartosc = elementy.get(nazwa);
int nowaWartosc;
if(staraWartosc == null)
nowaWartosc = 1;
else
nowaWartosc = staraWartosc + 1;
elementy.put(nazwa, nowaWartosc);
}
public void dodajTekst(int dlugosc) {
dlugoscTekstow += dlugosc;
}
public void zapamietajGlebokosc(int glebokosc) {
if(glebokosc > maxGlebokosc)
maxGlebokosc = glebokosc;
}
}
package gotowe.dom;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import common.Args;
/**Przyklad tworzenia drzewa DOM przy uzyciu obiektu DocumentBuilder.
* Program parsuje podany dokument do drzewa DOM,
* a nastepnie wypisuje informacje o dokumencie uzywajac
* obiektu klasy DomSimplePrinter.
* @author Patryk Czarnik
*/
public class DomBuilder {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik zrodlowy
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "in/dok1.xml");
try {
System.out.println("Pocztek dzialania.");
/* tworzymy parser DOM */
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = factory.newDocumentBuilder();
/* parsujemy dokument, doc bedzie korzeniem drzewa DOM */
System.out.println("Poczatek parsowania.");
Document doc = parser.parse(args[0]);
/* wypisujemy informacje o drzewie */
System.out.println("Poczatek przetwarzania.");
DomSimplePrinter simplePrinter = new DomSimplePrinter();
simplePrinter.printDomTree(doc);
System.out.println("Koniec.");
} catch(Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
package gotowe.dom;
import java.io.FileOutputStream;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSSerializer;
import common.Args;
/**
* Demonstracja tworzenia nowego drzewa DOM.
* Program tworzy prosty dokument XML jako drzewo DOM
* i zapisuje dokument uzywajac LS.
* @author Patryk Czarnik
*/
public class DomCreateSave {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik wynikowy
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "out/new_DomCreateSave.xml");
try {
System.out.println("Poczatek dzialania.");
/*
* Pobieramy obiekt typu DOMImplementation. Gdybysmy mieli w reku dokument
* wystarczyloby wywolac doc.getImplementation() Ale nie mamy dokumentu i
* musimy uzyc klasy DOMImplementationRegistry.
*/
DOMImplementationRegistry registry = DOMImplementationRegistry
.newInstance();
DOMImplementation domImpl = registry.getDOMImplementation("XML 3.0 LS 3.0");
if(domImpl == null) {
System.err.println("Nie udalo sie uzyskac obiektu DOMImplementation");
return;
}
/* tworzymy dokument */
Document doc = domImpl.createDocument("", "doc", null);
Node nd1 = doc.getDocumentElement();
Node nd2 = doc.createElementNS("", "aaa");
nd1.appendChild(nd2);
Node txt = doc.createTextNode("Trala lala");
nd2.appendChild(txt);
nd2 = doc.createElementNS("", "bbb");
nd1.appendChild(nd2);
txt = doc.createTextNode("Ala ma kota");
nd2.appendChild(txt);
/* Zapisujemy zmieniony uzywajac Load and Save: */
DOMImplementationLS lsImpl = (DOMImplementationLS)domImpl.getFeature(
"LS", "3.0");
if(lsImpl == null) {
System.err.println("Nie udalo sie uzyskac obiektu DOMImplementationLS");
return;
}
LSSerializer ser = lsImpl.createLSSerializer();
LSOutput out = lsImpl.createLSOutput();
/* ustawiamy plik */
out.setByteStream(new FileOutputStream(args[0]));
System.out.println("Poczatek zapisywania.");
ser.write(doc, out);
System.out.println("Koniec.");
} catch(Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
package gotowe.dom;
import java.io.FileOutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSSerializer;
import common.Args;
/**
* Demonstracja tworzenia nowego drzewa DOM.
* Program tworzy prosty dokument XML jako drzewo DOM
* i zapisuje dokument uzywajac LS.
* Do utworzenia obiektu DOMImplementation uzywany jest DocumentBuilder.
* @author Patryk Czarnik
*/
public class DomCreateSave2 {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik wynikowy
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "out/new_DomCreateSave2.xml");
try {
System.out.println("Poczatek dzialania.");
/*
* Pobieramy obiekt typu DOMImplementation.
* W tym przykladzie uzywamy DocumentBuildera.
*/
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = factory.newDocumentBuilder();
DOMImplementation domImpl = parser.getDOMImplementation();
if(domImpl == null) {
System.err.println("Nie udalo sie uzyskac obiektu DOMImplementation");
return;
}
/* tworzymy dokument */
Document doc = domImpl.createDocument("", "doc", null);
Node nd1 = doc.getDocumentElement();
Node nd2 = doc.createElementNS("", "aaa");
nd1.appendChild(nd2);
Node txt = doc.createTextNode("Trala lala");
nd2.appendChild(txt);
nd2 = doc.createElementNS("", "bbb");
nd1.appendChild(nd2);
txt = doc.createTextNode("Ala ma kota");
nd2.appendChild(txt);
/* Zapisujemy zmieniony uzywajac Load and Save: */
DOMImplementationLS lsImpl = (DOMImplementationLS)domImpl.getFeature(
"LS", "3.0");
if(lsImpl == null) {
System.err.println("Nie udalo sie uzyskac obiektu DOMImplementationLS");
return;
}
LSSerializer ser = lsImpl.createLSSerializer();
LSOutput out = lsImpl.createLSOutput();
/* ustawiamy plik */
out.setByteStream(new FileOutputStream(args[0]));
System.out.println("Poczatek zapisywania.");
ser.write(doc, out);
System.out.println("Koniec.");
} catch(Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
package gotowe.dom;
import java.io.FileOutputStream;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSParser;
import org.w3c.dom.ls.LSSerializer;
import common.Args;
/**
* Demonstracja standardu DOM Load and Save. Program parsuje dokument uzywajac
* LS, modyfikuje drzewo uzywajac obiektu DomModyfikator (dopisuje atrybuty
* mowiace o liczbie dzieci) i zapisuje dokument uzywajac LS.
*
* @author Patryk Czarnik
*/
public class DomLoadSave {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik zrodlowy
* <li> plik wynikowy
* <li> (opcjonalny) kodowanie znakow pliku wynikowego
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "in/rooms.xml", "out/new_DomLoadSave.xml");
try {
System.out.println("Pocztek dzialania.");
/*
* Pobieramy obiekt typu DOMImplementation. Gdybysmy mieli w reku dokument
* wystarczyloby wywolac doc.getImplementation() Ale nie mamy dokumentu i
* musimy uzyc klasy DOMImplementationRegistry.
*/
DOMImplementationRegistry registry = DOMImplementationRegistry
.newInstance();
DOMImplementation domImpl = registry.getDOMImplementation("XML 3.0 LS 3.0");
if(domImpl == null) {
System.err.println("Nie udalo sie uzyskac obiektu DOMImplementation");
return;
}
/*
* Teraz pobieramy obiekt typu DOMImplementationLS, to jeden ze sposobow.
*/
DOMImplementationLS lsImpl = (DOMImplementationLS)domImpl.getFeature("LS", "3.0");
if(lsImpl == null) {
System.err.println("Nie udalo sie uzyskac obiektu DOMImplementation");
return;
}
/* tworzymy parser */
LSParser parser = lsImpl.createLSParser(
DOMImplementationLS.MODE_SYNCHRONOUS, null);
/* parsujemy */
System.out.println("Poczatek parsowania.");
Document doc = parser.parseURI(args[0]);
/* modyfikujemy dokument */
System.out.println("Poczatek przetwarzania.");
DomModyfikator modyfikator = new DomModyfikator();
modyfikator.dopiszAtrybuty(doc);
/* Zapisujemy zmieniony uzywajac Load and Save: */
LSSerializer ser = lsImpl.createLSSerializer();
LSOutput out = lsImpl.createLSOutput();
/* ustawiamy plik */
out.setByteStream(new FileOutputStream(args[1]));
/* ustawiamy kodowanie */
if(args.length == 3)
out.setEncoding(args[2]);
System.out.println("Poczatek zapisywania.");
ser.write(doc, out);
System.out.println("Koniec.");
} catch(Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
package gotowe.dom;
import java.io.FileOutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSParser;
import org.w3c.dom.ls.LSSerializer;
import common.Args;
/**
* Demonstracja standardu DOM Load and Save. Program parsuje dokument uzywajac
* LS, modyfikuje drzewo uzywajac obiektu DomModyfikator (dopisuje atrybuty
* mowiace o liczbie dzieci) i zapisuje dokument uzywajac LS.
*
* @author Patryk Czarnik
*/
public class DomLoadSave2 {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik zrodlowy
* <li> plik wynikowy
* <li> (opcjonalny) kodowanie znakow pliku wynikowego
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "in/rooms.xml", "out/new_DomLoadSave2.xml");
try {
System.out.println("Pocztek dzialania.");
/*
* Pobieramy obiekt typu DOMImplementation.
* W tym przykladzie uzywamy DocumentBuildera.
*/
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
DOMImplementation domImpl = builder.getDOMImplementation();
if(domImpl == null) {
System.err.println("Nie udalo sie uzyskac obiektu DOMImplementation");
return;
}
/*
* Teraz pobieramy obiekt typu DOMImplementationLS, to jeden ze sposobow.
*/
DOMImplementationLS lsImpl = (DOMImplementationLS)domImpl.getFeature(
"LS", "3.0");
if(lsImpl == null) {
System.err.println("Nie udalo sie uzyskac obiektu DOMImplementation");
return;
}
/* tworzymy parser */
LSParser parser = lsImpl.createLSParser(
DOMImplementationLS.MODE_SYNCHRONOUS, null);
/* parsujemy */
System.out.println("Poczatek parsowania.");
Document doc = parser.parseURI(args[0]);
/* modyfikujemy dokument */
System.out.println("Poczatek przetwarzania.");
DomModyfikator modyfikator = new DomModyfikator();
modyfikator.dopiszAtrybuty(doc);
/* Zapisujemy zmieniony uzywajac Load and Save: */
LSSerializer ser = lsImpl.createLSSerializer();
LSOutput out = lsImpl.createLSOutput();
/* ustawiamy plik */
out.setByteStream(new FileOutputStream(args[1]));
/* ustawiamy kodowanie */
if(args.length == 3)
out.setEncoding(args[2]);
System.out.println("Poczatek zapisywania.");
ser.write(doc, out);
System.out.println("Koniec.");
} catch(Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
package gotowe.dom;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**Klasa sluzaca do zmiany drzewa DOM.
* @author Patryk Czarnik
*/
public class DomModyfikator {
/**Przechodzi podane drzewo DOM i do kazdego elementu
* dopisuje (albo nadpisuje) atrybut liczba_dzieci,
* ktorego wartoscia jest liczba dzieci danego elementu
* (w sensie drzewa DOM).
* @param nd wezel, ktorego podrzewo jest modyfikowane
*/
public void dopiszAtrybuty(Node nd) {
switch(nd.getNodeType()) {
case Node.ELEMENT_NODE :
Element el = (Element)nd;
int liczbaDzieci = el.getChildNodes().getLength();
String napisLiczbaDzieci = String.valueOf(liczbaDzieci);
el.setAttribute("liczba_dzieci", napisLiczbaDzieci);
// bez breaka!
case Node.DOCUMENT_NODE :
zmienDzieci(nd);
break;
}
}
/**Przechodzi dzieci podanego wezla i wywoluje dla nich
* metode dopiszAtrybuty
* @param nd wezel, ktorego dzieci przechodzimy
*/
private void zmienDzieci(Node nd) {
for(Node cur = nd.getFirstChild(); cur != null; cur = cur.getNextSibling()) {
dopiszAtrybuty(cur);
}
}
}
package gotowe.dom;
import org.w3c.dom.Node;
/**Klasa sluzaca do prostego wypisywania informacji o drzewie DOM.
* @author Patryk Czarnik
*
*/
public class DomSimplePrinter {
/**Domyslny konstruktor. */
public DomSimplePrinter() {
super();
}
/**Przechodzi podane drzewo DOM i wypisuje proste
* informacje o niektorych typach wezlow.
* @param nd wezel, ktorego podrzewo jest wypisywane
*/
public void printDomTree(Node nd) {
switch(nd.getNodeType()) {
case Node.DOCUMENT_NODE :
System.out.println("DOKUMENT");
printChildren(nd);
break;
case Node.ELEMENT_NODE :
System.out.println("ELEMENT: qName="+nd.getNodeName()+" URI= "+nd.getNamespaceURI()+
" localName="+nd.getLocalName()+" attributes:"+nd.getAttributes().getLength());
printChildren(nd);
break;
case Node.TEXT_NODE :
String napis = nd.getNodeValue();
/* obcinam gdyby byl bardzo dlugi */
if(napis.length() > 512)
napis = napis.substring(0, 512);
System.out.println("TEXT: "+napis);
break;
}
}
/**Przechodzi dzieci podanego wezla i wywoluje dla nich
* metode printDomTree.
* @param nd wezel, ktorego dzieci przechodzimy
*/
private void printChildren(Node nd) {
for(Node cur = nd.getFirstChild(); cur != null; cur = cur.getNextSibling()) {
printDomTree(cur);
}
}
}
package gotowe.dom;
import java.io.FileOutputStream;
import javax.xml.XMLConstants;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSSerializer;
import common.Args;
/**Przyklad walidacji drzewa DOM znajdujacego sie w pamieci.
* Program tworzy dokument tak jak w DomCreateSave,
* ale przed zapisaniem do pliku waliduje drzewo wzgledem podanego
* schematu.
* @author Patryk Czarnik
*
*/
public class DomTreeValid {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik wynikowy
* <li> plik ze schematem
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "out/new_DomTreeValid.xml", "in/schema3.xsd");
try {
System.out.println("Poczatek dzialania.");
/*
* Pobieramy obiekt typu DOMImplementation. Gdybysmy mieli w reku dokument
* wystarczyloby wywolac doc.getImplementation() Ale nie mamy dokumentu i
* musimy uzyc klasy DOMImplementationRegistry.
*/
DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
DOMImplementation domImpl = registry.getDOMImplementation("XML 3.0 LS 3.0");
/* tworzymy dokument */
Document doc = domImpl.createDocument("", "doc", null);
Node nd1 = doc.getDocumentElement();
Node nd2 = doc.createElementNS("", "aaa");
nd1.appendChild(nd2);
Node txt = doc.createTextNode("Trala lala");
nd2.appendChild(txt);
nd2 = doc.createElementNS("", "bbb");
nd1.appendChild(nd2);
txt = doc.createTextNode("Ala ma kota");
nd2.appendChild(txt);
System.out.println("Walidacja.");
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schemat = schemaFactory.newSchema(new StreamSource(args[1]));
Validator validator = schemat.newValidator();
/* Walidacja, wykorzystujemy typ DOMSource (taki jak dla transformacji). */
validator.validate(new DOMSource(doc));
/* Zapisujemy zmieniony uzywajac Load and Save: */
DOMImplementationLS lsImpl = (DOMImplementationLS)domImpl.getFeature("LS", "3.0");
LSSerializer ser = lsImpl.createLSSerializer();
LSOutput out = lsImpl.createLSOutput();
/* ustawiamy plik */
out.setByteStream(new FileOutputStream(args[0]));
System.out.println("Poczatek zapisywania.");
ser.write(doc, out);
System.out.println("Koniec.");
} catch(Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
package gotowe.dom;
import java.io.FileOutputStream;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSSerializer;
import common.Args;
/**Przyklad walidacji drzewa DOM znajdujacego sie w pamieci.
* Program tworzy dokument tak jak w DomCreateSave,
* ale przed zapisaniem do pliku waliduje drzewo wzgledem podanego
* schematu.
* @author Patryk Czarnik
*
*/
public class DomTreeValid2 {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik wynikowy
* <li> plik ze schematem
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "out/new_DomTreeValid2.xml", "in/schema3.xsd");
try {
System.out.println("Poczatek dzialania.");
/*
* Pobieramy obiekt typu DOMImplementation.
* W tym przykladzie uzywamy DocumentBuildera.
*/
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = factory.newDocumentBuilder();
DOMImplementation domImpl = parser.getDOMImplementation();
if(domImpl == null) {
System.err.println("Nie udalo sie uzyskac obiektu DOMImplementation");
return;
}
/* tworzymy dokument */
Document doc = domImpl.createDocument("", "doc", null);
Node nd1 = doc.getDocumentElement();
Node nd2 = doc.createElementNS("", "aaa");
nd1.appendChild(nd2);
Node txt = doc.createTextNode("Trala lala");
nd2.appendChild(txt);
nd2 = doc.createElementNS("", "bbb");
nd1.appendChild(nd2);
txt = doc.createTextNode("Ala ma kota");
nd2.appendChild(txt);
System.out.println("Walidacja.");
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schemat = schemaFactory.newSchema(new StreamSource(args[1]));
Validator validator = schemat.newValidator();
/* Walidacja, wykorzystujemy typ DOMSource (taki jak dla transformacji). */
validator.validate(new DOMSource(doc));
/* Zapisujemy zmieniony uzywajac Load and Save: */
DOMImplementationLS lsImpl = (DOMImplementationLS)domImpl.getFeature("LS", "3.0");
LSSerializer ser = lsImpl.createLSSerializer();
LSOutput out = lsImpl.createLSOutput();
/* ustawiamy plik */
out.setByteStream(new FileOutputStream(args[0]));
System.out.println("Poczatek zapisywania.");
ser.write(doc, out);
System.out.println("Koniec.");
} catch(Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
package gotowe.dom;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import common.Args;
import common.InfoHandler;
import common.MojErrorHandler;
/**
* Przyklad tworzenia drzewa DOM z jednoczesna walidacja w starym stylu. Program
* parsuje (walidujac jednoczesnie) podany dokument do drzewa DOM, a nastepnie
* wypisuje informacje o dokumencie uzywajac obiektu klasy DomSimplePrinter.
*
* @author Patryk Czarnik
*/
public class DomValidDtd {
/**
* @param args argumenty programu:
* <ol>
* <li>plik wejściowy
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "in/wyniki.xml");
try {
System.out.println("Pocztek dzialania.");
/* tworzymy parser DOM */
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
DocumentBuilder parser = factory.newDocumentBuilder();
MojErrorHandler errorHandler = new MojErrorHandler();
parser.setErrorHandler(errorHandler);
/* parsujemy dokument, doc bedzie korzeniem drzewa DOM */
System.out.println("Poczatek parsowania.");
Document doc = parser.parse(args[0]);
System.out.println("Czy były błędy? " + errorHandler.czyBylBlad());
/* wypisujemy informacje o drzewie */
System.out.println("Poczatek przetwarzania.");
DomSimplePrinter simplePrinter = new DomSimplePrinter();
simplePrinter.printDomTree(doc);
System.out.println("Koniec.");
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
package gotowe.dom;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import org.w3c.dom.Document;
import common.Args;
import common.InfoHandler;
import common.MojErrorHandler;
/**
* Przyklad tworzenia drzewa DOM z jednoczesna walidacja w "nowym" stylu,
* wzgledem schematu XML Schema. Program parsuje (walidujac jednoczesnie) podany
* dokument do drzewa DOM, a nastepnie wypisuje informacje o dokumencie uzywajac
* obiektu klasy DomSimplePrinter.
*
* @author Patryk Czarnik
*/
public class DomValidSchema {
/**
* @param args argumenty programu:
* <ol>
* <li>plik zrodlowy
* <li>plik ze schematem
* <li>jesli wystepuje, parser jest namespace-aware
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "in/sklep.xml", "in/sklep.xsd");
try {
System.out.println("Pocztek dzialania.");
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(new StreamSource(args[1]));
/* tworzymy parser DOM */
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
factory.setSchema(schema);
if (args.length >= 3)
factory.setNamespaceAware(true);
else
factory.setNamespaceAware(false);
DocumentBuilder parser = factory.newDocumentBuilder();
MojErrorHandler errorHandler = new MojErrorHandler();
parser.setErrorHandler(errorHandler);
/* parsujemy dokument, doc bedzie korzeniem drzewa DOM */
System.out.println("Poczatek parsowania.");
Document doc = parser.parse(args[0]);
System.out.println("Czy były błędy? " + errorHandler.czyBylBlad());
/* wypisujemy informacje o drzewie */
System.out.println("Poczatek przetwarzania.");
DomSimplePrinter simplePrinter = new DomSimplePrinter();
simplePrinter.printDomTree(doc);
System.out.println("Koniec.");
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
package gotowe.dom;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.DOMImplementationList;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
/**Przyklad pobierania obiektow DOMImplemetation.
* Program wypisuje informacje o wszystkich znalezionych
* w srodowisku implementacjach DOM.
* @author Patryk Czarnik
*/
public class PrintDomImplementations {
/**
* @param args
* argumenty programu:
* <ol>
* <li> (opcjonalny) parametr dla metody getDOMImplementationList
* </ol>
*/
public static void main(String[] args) {
System.out.println("Poczatek");
String features = args.length > 0 ? args[0] : "";
try {
DOMImplementationRegistry reg = DOMImplementationRegistry.newInstance();
DOMImplementationList domImplList = reg.getDOMImplementationList(features);
int n = domImplList.getLength();
for(int i = 0; i < n; ++i) {
DOMImplementation domImpl = domImplList.item(i);
System.out.println("KOLEJNA IMPLEMENTACJA DOM:");
System.out.println(domImpl.toString()+"\n\n");
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Koniec");
}
}
package gotowe.dom;
import java.io.IOException;
import java.io.OutputStreamWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import common.Args;
/** Przyklad serializacji drzewa DOM przy uzyciu klasy Transformer.
* @author Patryk Czarnik
*/
public class SaveDOM {
public static void main(String[] args) {
args = Args.argsOrDefault(args, "in/dok1.xml");
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(args[0]);
TransformerFactory trans_fact = TransformerFactory.newInstance();
Transformer transformer = trans_fact.newTransformer();
Source src = new DOMSource(doc);
Result res = new StreamResult(new OutputStreamWriter(System.out, "utf-8"));
transformer.transform(src, res);
} catch (DOMException e) {
e.printStackTrace();
} catch (FactoryConfigurationError e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
}
package gotowe.dom;
import java.io.FileOutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSSerializer;
import common.Args;
/**
* @author Patryk Czarnik
*
*/
public class TestDomNS {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik wynikowy
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "out/new_TestDomNS.xml");
try {
System.out.println("Poczatek dzialania.");
/*
* Pobieramy obiekt typu DOMImplementation.
* W tym przykladzie uzywamy DocumentBuildera.
*/
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = factory.newDocumentBuilder();
DOMImplementation domImpl = parser.getDOMImplementation();
if(domImpl == null) {
System.err.println("Nie udalo sie uzyskac obiektu DOMImplementation");
return;
}
/* tworzymy dokument z domyslna przestrzenia nazw */
Document doc = domImpl.createDocument("http://namespace", "root", null);
Node nd1 = doc.getDocumentElement();
Node nd2 = doc.createElement("aaa");
nd1.appendChild(nd2);
String ns2 = nd2.getNamespaceURI();
System.out.println("Przestrzen nazw to: "+ns2);
/* Zapisujemy zmieniony uzywajac Load and Save: */
DOMImplementationLS lsImpl = (DOMImplementationLS)domImpl.getFeature("LS", "3.0");
LSSerializer ser = lsImpl.createLSSerializer();
LSOutput out = lsImpl.createLSOutput();
/* ustawiamy plik */
out.setByteStream(new FileOutputStream(args[0]));
System.out.println("Poczatek zapisywania.");
ser.write(doc, out);
System.out.println("Koniec.");
} catch(Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
package gotowe.sax;
import java.io.PrintStream;
import java.util.Map;
import java.util.TreeMap;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* @author patryk
* Obiekt tej klasy zlicza wystąpienia elementów o różnych nazwach oraz węzłów tekstowych w dokumencie.
*/
public class CountingHandler extends DefaultHandler implements ContentHandler {
private Map<String, Integer> fMap;
/**
*
*/
public CountingHandler() {
fMap = new TreeMap<String, Integer>();
fMap.put("#text", 0);
}
/**
* @param aOut
*/
public void wypiszSie(PrintStream aOut) {
for(Map.Entry<String, Integer> entry : fMap.entrySet()) {
aOut.println("Element "+entry.getKey()+" ---- "+entry.getValue());
}
}
/**
* @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
*/
@Override
public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
super.characters(arg0, arg1, arg2);
fMap.put("#text", fMap.get("#text") + 1);
}
/**
* @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
*/
@Override
public void startElement(String uri, String aLocal, String aQName, Attributes arg3) throws SAXException {
super.startElement(uri, aLocal, aQName, arg3);
if(fMap.containsKey(aQName)) {
fMap.put(aQName, fMap.get(aQName) + 1);
} else {
fMap.put(aQName, 1);
}
}
}
package gotowe.sax;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.XMLFilterImpl;
/**Filtr zmienia nazwy elementow na pisane duzymi literami. */
public class FiltrDuzeLitery extends XMLFilterImpl {
/**Zmienia nazwy elementow na pisane duzymi literami.
* @see org.xml.sax.helpers.XMLFilterImpl#endElement(java.lang.String, java.lang.String, java.lang.String)
*/
@Override
public void endElement(String aUri, String aLocalName, String aName) throws SAXException {
if(this.getContentHandler() != null)
this.getContentHandler().endElement(aUri, aLocalName.toUpperCase(), aName.toUpperCase());
}
/**Zmienia nazwy elementow na pisane duzymi literami.
* @see org.xml.sax.helpers.XMLFilterImpl#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
*/
@Override
public void startElement(String aUri, String aLocalName, String aName, Attributes atts) throws SAXException {
if(this.getContentHandler() != null)
this.getContentHandler().startElement(aUri, aLocalName.toUpperCase(), aName.toUpperCase(), atts);
}
}
\ No newline at end of file
package gotowe.sax;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
/**Przyklad ContentHandlera.
* Informuje o niektorych zdarzeniach SAX wypisujac tekst na standardowe wyjscie.
* @author Patryk Czarnik
*/
public class InfoHandler extends DefaultHandler {
/**Domyslny konstruktor. */
public InfoHandler() {
super();
}
/* Metody interfejsu ContentHandler: */
/**Informuje o zdarzeniu "wezel tekstowy".
* @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
*/
@Override
public void characters(char[] aCh, int aStart, int aLength) throws SAXException {
/* obcinamy napis jesli bylby za dlugi do wypisania */
aLength = (aLength <= 512) ? aLength : 512;
String napis = new String(aCh, aStart, aLength);
System.out.print("CHARACTERS: ");
System.out.println(napis);
}
/**Informuje o zdarzeniu "pocztaek elementu".
* @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
*/
@Override
public void startElement(String aUri, String aLocalName, String aName, Attributes aAttributes) throws SAXException {
System.out.println("START_ELEMENT qName="+aName+" URI="+aUri+" localName="+aLocalName
+" attributes: "+aAttributes.getLength());
}
/**Informuje o zdarzeniu "koniec elementu".
* @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
*/
@Override
public void endElement(String aUri, String aLocalName, String aName) throws SAXException {
System.out.println("END_ELEMENT qName="+aName+" URI="+aUri+" localName="+aLocalName);
}
/* Metody interfejsu ErrorHandler: */
/**Informuje o zwyklym bledzie.
* @see org.xml.sax.helpers.DefaultHandler#error(org.xml.sax.SAXParseException)
*/
@Override
public void error(SAXParseException e) throws SAXException {
System.err.println("ERROR: "+e.getMessage());
}
/**Informuje o powaznym bledzie.
* @see org.xml.sax.helpers.DefaultHandler#fatalError(org.xml.sax.SAXParseException)
*/
@Override
public void fatalError(SAXParseException e) throws SAXException {
System.err.println("FATAL_ERROR: "+e.getMessage());
}
/**Informuje o ostrzezeniu.
* @see org.xml.sax.helpers.DefaultHandler#warning(org.xml.sax.SAXParseException)
*/
@Override
public void warning(SAXParseException e) throws SAXException {
System.err.println("WARNING: "+e.getMessage());
}
}
package gotowe.sax;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
import common.Args;
public class MakeUpperCase {
public static void main(String[] args) {
args = Args.argsOrDefault(args, "in/sklep.xml", "out/new_MakeUpperCase.xml");
try {
InputSource input = new InputSource(args[0]);
XMLReader reader = XMLReaderFactory.createXMLReader();
FiltrDuzeLitery filter = new FiltrDuzeLitery();
filter.setParent(reader);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
SAXSource saxSource = new SAXSource(filter, input);
StreamResult result = new StreamResult(args[1]);
trans.transform(saxSource, result);
System.out.println("OK");
} catch(Exception e) {
e.printStackTrace();
}
}
}
package gotowe.sax;
import java.io.OutputStreamWriter;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import common.Args;
public class SaveSAX {
public static void main(String[] args) {
args = Args.argsOrDefault(args, "in/sklep.xml");
try {
SAXParserFactory parser_fact = SAXParserFactory.newInstance();
XMLReader parser = parser_fact.newSAXParser().getXMLReader();
InputSource doc = new InputSource(args[0]);
TransformerFactory trans_fact = TransformerFactory.newInstance();
Transformer transformer = trans_fact.newTransformer();
System.out.println("Poczatek przeksztalcania.");
Source src = new SAXSource(parser, doc);
Result res = new StreamResult(new OutputStreamWriter(System.out, "utf-8"));
transformer.transform(src, res);
System.out.println("Koniec przeksztalcania.");
} catch (Exception e) {
System.out.println("Wyjatek: "+e.getMessage());
e.printStackTrace();
}
}
}
package gotowe.sax;
import java.io.OutputStreamWriter;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import common.Args;
public class SaveSAXFiltr {
public static void main(String[] args) {
args = Args.argsOrDefault(args, "in/sklep.xml");
try {
SAXParserFactory parser_fact = SAXParserFactory.newInstance();
XMLReader parser = parser_fact.newSAXParser().getXMLReader();
InputSource doc = new InputSource(args[0]);
TransformerFactory trans_fact = TransformerFactory.newInstance();
Transformer transformer = trans_fact.newTransformer();
FiltrDuzeLitery filtr = new FiltrDuzeLitery();
filtr.setParent(parser);
System.out.println("Poczatek przeksztalcania.");
Source src = new SAXSource(filtr, doc);
Result res = new StreamResult(new OutputStreamWriter(System.out, "utf-8"));
transformer.transform(src, res);
System.out.println("Koniec przeksztalcania.");
} catch (Exception e) {
System.out.println("Wyjatek: "+e.getMessage());
e.printStackTrace();
}
}
}
package gotowe.sax;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.XMLReader;
import common.Args;
/**Demonstracja SAXa.
* Program parsuje podany plik XML w trybie SAX
* i obsluguje zdarzenia obiektem klasy InfoHandler.
* @author Patryk Czarnik
*/
public class SaxCounter {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik zrodlowy
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "in/sklep.xml");
if(args.length < 1) {
System.err.println("Za malo parametrow");
System.exit(0);
}
try {
System.out.println("Pocztek dzialania.");
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader();
/* tworzymy ContentHandler */
CountingHandler handler = new CountingHandler();
/* laczymy */
reader.setContentHandler(handler);
/* i parsujemy, zdarzenia SAX sa obslugiwane naszym handlerem */
System.out.println("Poczatek parsowania.");
reader.parse(args[0]);
System.out.println("Koniec parsowania.");
handler.wypiszSie(System.out);
} catch(Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
package gotowe.sax;
import javax.xml.XMLConstants;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.Result;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.ValidatorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.XMLFilter;
import org.xml.sax.XMLReader;
import common.Args;
/**Przyklad polaczenia obiektow Transformer i SAXSource poprzez filtr SAX.
* Program parsuje podany plik XML, przepuszcza zdarzenia SAX przez filtr i zapisuje do podanego pliku.
* @author Patryk Czarnik
*
*/
public class SaxFilterValidation {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik zrodlowy
* <li> plik wynikowy
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "in/sklep.xml", "out/new_SaxFilterValidation.xml", "in/sklep.xsd");
try {
System.out.println("Pocztek dzialania.");
/* dokument, ktory bedziemy parsowac */
InputSource doc = new InputSource(args[0]);
/* tworzymy parser SAX (XMLReader) */
SAXParserFactory parser_fact = SAXParserFactory.newInstance();
XMLReader reader = parser_fact.newSAXParser().getXMLReader();
/* tworzymy filtr */
XMLFilter filtr = new FiltrDuzeLitery();
filtr.setParent(reader);
/* tworzymy ValidatorHandler */
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema sch = sf.newSchema(new StreamSource(args[2]));
ValidatorHandler vh = sch.newValidatorHandler();
filtr.setContentHandler(vh);
/* tworzymy TransformerHandler (bez XSLT) */
SAXTransformerFactory tf = (SAXTransformerFactory)SAXTransformerFactory.newInstance();
TransformerHandler th = tf.newTransformerHandler();
vh.setContentHandler(th);
Result res = new StreamResult(args[1]);
th.setResult(res);
/* przeksztalcenie */
System.out.println("Poczatek przeksztalcania.");
filtr.parse(doc);
System.out.println("Koniec przeksztalcania.");
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
package gotowe.sax;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.ContentHandler;
import org.xml.sax.XMLReader;
import common.Args;
/**Przyklad uzycia filtra SAX.
* Program parsuje podany dokument w trybie SAX,
* przepuszcza zdarzenia przez filtr FiltrDuzeLitery
* i obsluguje zdarzenia obiektem InfoHandler.
* @author Patryk Czarnik
*/
public class SaxFiltry {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik zrodlowy
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "in/sklep.xml");
try {
System.out.println("Pocztek dzialania.");
/* tworzymy parser SAX (XMLReader) */
SAXParserFactory parser_fact = SAXParserFactory.newInstance();
XMLReader reader = parser_fact.newSAXParser().getXMLReader();
/* tworzymy filtr */
FiltrDuzeLitery filtr = new FiltrDuzeLitery();
/* tworzymy ContentHandler */
ContentHandler handler = new InfoHandler();
/* laczymy wszystko */
filtr.setParent(reader);
filtr.setContentHandler(handler);
/* i parsujemy (filtr pelni role parsera) */
System.out.println("Poczatek parsowania.");
filtr.parse(args[0]);
System.out.println("Koniec parsowania.");
} catch(Exception e) {
e.printStackTrace();
}
}
}
package gotowe.sax;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import common.Args;
/**
* Program w trakcie prasowania podmienia ContentHandlera na innego.
* @author Patryk Czarnik
*/
public class SaxPodmiana {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik zrodlowy
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "in/dok1.xml");
try {
System.out.println("Poczatek dzialania.");
/* tworzymy parser SAX */
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader();
/* tworzymy ContentHandlery */
ContentHandler handler2 = new Handler2();
ContentHandler handler1 = new Handler1(reader, handler2);
/* laczymy z pierwszym, drugi moze podlaczyc sie w trakcie dzialania */
reader.setContentHandler(handler1);
System.out.println("Poczatek parsowania.");
reader.parse(args[0]);
System.out.println("Koniec parsowania.");
} catch(Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
private static class Handler1 extends DefaultHandler {
private XMLReader reader;
private ContentHandler drugi;
public Handler1(XMLReader aReader, ContentHandler aDrugi) {
reader = aReader;
drugi = aDrugi;
}
@Override
public void startElement(String aUri, String aLocalName, String aName, Attributes attributes) {
System.out.println("Jetem Handler1. Element o nazwie " + aName);
if("bbb".equals(aName)) {
System.out.println("Przelaczamy handlera");
reader.setContentHandler(drugi);
}
}
}
private static class Handler2 extends DefaultHandler {
@Override
public void startElement(String aUri, String aLocalName, String aName, Attributes attributes) {
System.out.println("Jetem Handler2. Element o nazwie " + aName);
}
}
}
package gotowe.sax;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.ContentHandler;
import org.xml.sax.XMLReader;
import common.Args;
/**Demonstracja SAXa.
* Program parsuje podany plik XML w trybie SAX
* i obsluguje zdarzenia obiektem klasy InfoHandler.
* @author Patryk Czarnik
*/
public class SaxSimplePrinter {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik zrodlowy
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "in/dok1.xml");
try {
System.out.println("Pocztek dzialania.");
/* tworzymy parser SAX */
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
/* W Javie mozna uzywac bezposrednio SAXParser:
* parser.parse(new InputStream(fileName), handler);
* Ale my zrobimy to poprzez obiekt typu XMLReader
* ktory jest zdefiniowany w standardzie SAX.
*/
XMLReader reader = parser.getXMLReader();
/* tworzymy ContentHandler */
ContentHandler handler = new InfoHandler();
/* laczymy */
reader.setContentHandler(handler);
/* i parsujemy, zdarzenia SAX sa obslugiwane naszym handlerem */
System.out.println("Poczatek parsowania.");
reader.parse(args[0]);
System.out.println("Koniec parsowania.");
} catch(Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
package gotowe.sax;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.XMLReader;
import common.Args;
/**Demonstracja starego stylu walidacji przy okazji parsowania SAXem.
* Program parsuje podany plik XML walidujacym parserem SAX
* i obsluguje zdarzenia obiektem klasy InfoHandler.
* @author Patryk Czarnik
*/
public class SaxValidDtd {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik zrodlowy
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "in/wyniki.xml");
try {
System.out.println("Poczatek dzialania.");
/* tworzymy parser SAX, fabryka daje parsery walidujace */
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
XMLReader reader = factory.newSAXParser().getXMLReader();
/* tworzymy ContentHandler */
InfoHandler handler = new InfoHandler();
/* laczymy */
reader.setContentHandler(handler);
/* UWAGA! Aby obslugiwac bledy walidacji nalezy podlaczyc
* obiekt typu ErrorHandler. My uzyjemy naszej implementacji, ktora
* tylko informuje o bledach.
*/
reader.setErrorHandler(handler);
/* i parsujemy, zdarzenia SAX sa obslugiwane naszym handlerem */
System.out.println("Poczatek parsowania.");
reader.parse(args[0]);
System.out.println("Koniec parsowania.");
} catch(Exception e) {
System.err.println("Wyjatek: " + e.getMessage());
e.printStackTrace();
}
}
}
package gotowe.sax;
import javax.xml.XMLConstants;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import org.xml.sax.XMLReader;
import common.Args;
/**Demonstracja walidacji wzgledem schematu podczas parsowania SAXem.
* Program parsuje podany plik XML walidujac wzgledem podanego schematu
* i obsluguje zdarzenia obiektem klasy InfoHandler.
* @author Patryk Czarnik
*/
public class SaxValidSchema {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik zrodlowy
* <li> plik ze schematem
* <li> jesli wystepuje, parser jest namespace-aware
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "in/sklep.xml", "in/sklep.xsd");
try {
System.out.println("Pocztek dzialania.");
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schemat = schemaFactory.newSchema(new StreamSource(args[1]));
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(false);
factory.setSchema(schemat);
if(args.length >= 3)
factory.setNamespaceAware(true);
else
factory.setNamespaceAware(false);
XMLReader reader = factory.newSAXParser().getXMLReader();
/* tworzymy ContentHandler */
InfoHandler handler = new InfoHandler();
/* laczymy */
reader.setContentHandler(handler);
/* UWAGA! Aby obslugiwac bledy walidacji nalezy podlaczyc
* obiekt typu ErrorHandler. My uzyjemy naszej implementacji, ktora
* tylko informuje o bledach.
*/
reader.setErrorHandler(handler);
/* i parsujemy, zdarzenia SAX sa obslugiwane naszym handlerem */
System.out.println("Poczatek parsowania.");
reader.parse(args[0]);
System.out.println("Koniec parsowania.");
} catch(Exception e) {
System.err.println("Wyjatek: " + e.getMessage());
e.printStackTrace();
}
}
}
package gotowe.sax;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
import common.Args;
public class StatsDirectly {
public static void main(String[] args) {
args = Args.argsOrDefault(args, "in/sklep.xml");
try {
StatsHandler myHandler = new StatsHandler();
XMLReader reader = XMLReaderFactory.createXMLReader();
reader.setContentHandler(myHandler);
reader.parse(args[0]);
System.out.println(myHandler);
} catch (Exception e) {
e.printStackTrace();
}
}
}
package gotowe.sax;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
import common.Args;
public class StatsFiltered {
public static void main(String[] args) {
args = Args.argsOrDefault(args, "in/sklep.xml");
try {
XMLReader reader = XMLReaderFactory.createXMLReader();
FiltrDuzeLitery filter = new FiltrDuzeLitery();
StatsHandler myHandler = new StatsHandler();
filter.setParent(reader);
filter.setContentHandler(myHandler);
filter.parse(args[0]);
System.out.println(myHandler);
} catch (Exception e) {
e.printStackTrace();
}
}
}
package gotowe.sax;
import java.util.TreeMap;
import java.util.Map;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class StatsHandler extends DefaultHandler {
private final Map<String, Integer> map = new TreeMap<String, Integer>();
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
Integer count = map.get(qName);
if(count == null)
count = 0;
count++;
map.put(qName, count);
}
public String toString() {
return map.toString();
}
}
package gotowe.transform;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import common.Args;
/**Prosty przyklad zastosowania klasy Transformer.
* Przeksztalcenie zrodla StreamSource i zapisanie wyniku przez StreamResult.
* Program parsuje podany plik XML i zapisuje wynik przeksztalcenia do podanego pliku.
* Jesli podano trzeci parametr, dokument jest przeksztalcany zgodnie z podanym arkuszem XSLT.
* @author Patryk Czarnik
*
*/
public class Transformer1 {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik zrodlowy
* <li> plik wynikowy
* <li> (opcjonalny) plik XSLT
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "in/sklep.xml", "out/new_Transformer1.html", "in/sklep.xsl");
try {
System.out.println("Pocztek dzialania.");
/* tworzymy transformer (z XSLT albo bez) */
TransformerFactory trans_fact = TransformerFactory.newInstance();
Transformer transformer;
if(args.length >= 3)
transformer = trans_fact.newTransformer(new StreamSource(args[2]));
else
transformer = trans_fact.newTransformer();
/* zrodlo i cel przeksztalcenia */
Source src = new StreamSource(args[0]);
Result res = new StreamResult(args[1]);
/* i przeksztalcamy */
System.out.println("Poczatek przeksztalcania.");
transformer.transform(src, res);
System.out.println("Koniec przeksztalcania.");
} catch(Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
package gotowe.transform;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import common.Args;
/**Prosty przyklad zastosowania klas Transformer i SAXSource.
* Przeksztalcenie zrodla SAXSource i zapisanie wyniku przez StreamResult.
* Program parsuje podany plik XML i zapisuje wynik przeksztalcenia do podanego pliku.
* Jesli podano trzeci parametr, dokument jest przeksztalcany zgodnie z podanym arkuszem XSLT.
* @author Patryk Czarnik
*
*/
public class Transformer2 {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik zrodlowy
* <li> plik wynikowy
* <li> (opcjonalny) plik XSLT
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "in/sklep.xml", "out/new_Transformer2.xml");
try {
System.out.println("Pocztek dzialania.");
/* tworzymy parser SAX (XMLReader) */
SAXParserFactory parser_fact = SAXParserFactory.newInstance();
XMLReader parser = parser_fact.newSAXParser().getXMLReader();
/* tworzymy transformer (z XSLT albo bez) */
TransformerFactory trans_fact = TransformerFactory.newInstance();
Transformer transformer;
if(args.length >= 3)
transformer = trans_fact.newTransformer(new StreamSource(args[2]));
else
transformer = trans_fact.newTransformer();
/* dokument, ktory bedziemy parsowac */
InputSource doc = new InputSource(args[0]);
/* zrodlo (teraz typu SAXSource) i cel przeksztalcenia */
Source src = new SAXSource(parser, doc);
Result res = new StreamResult(args[1]);
/* i przeksztalcamy */
System.out.println("Poczatek przeksztalcania.");
transformer.transform(src, res);
System.out.println("Koniec przeksztalcania.");
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
package gotowe.transform;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.InputSource;
import org.xml.sax.XMLFilter;
import org.xml.sax.XMLReader;
import common.Args;
import gotowe.sax.FiltrDuzeLitery;
/**Przyklad polaczenia obiektow Transformer i SAXSource poprzez filtr SAX.
* Program parsuje podany plik XML, przepuszcza zdarzenia SAX przez filtr i zapisuje do podanego pliku.
* @author Patryk Czarnik
*
*/
public class Transformer3 {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik zrodlowy
* <li> plik wynikowy
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "in/sklep.xml", "new_Transformer3.xml");
try {
System.out.println("Pocztek dzialania.");
/* tworzymy parser SAX (XMLReader) */
SAXParserFactory parser_fact = SAXParserFactory.newInstance();
XMLReader reader = parser_fact.newSAXParser().getXMLReader();
/* tworzymy transformer (bez XSLT) */
TransformerFactory trans_fact = TransformerFactory.newInstance();
Transformer transformer = trans_fact.newTransformer();
/* tworzymy filtr */
XMLFilter filtr = new FiltrDuzeLitery();
filtr.setParent(reader);
/* dokument, ktory bedziemy parsowac */
InputSource doc = new InputSource(args[0]);
/* teraz zrodlem zdarzen SAX dla Transformera jest filtr */
Source src = new SAXSource(filtr, doc);
Result res = new StreamResult(args[1]);
/* przeksztalcenie */
System.out.println("Poczatek przeksztalcania.");
transformer.transform(src, res);
System.out.println("Koniec przeksztalcania.");
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
package gotowe.xpath;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import org.xml.sax.InputSource;
import common.Args;
/**Przyklad zastosowania pakietu javax.xml.xpath.
* Program oblicza wyrazenie XPath w kontekscie korzenia podanego dokumentu
* i wypisuje wynik na standardowe wyjscie po zrzutowaniu na string.
* @author Patryk Czarnik
*
*/
public class XPathEvaluator {
/**
* @param args
* argumenty programu:
* <ol>
* <li> plik zrodlowy
* <li> wyrazenie XPath
* </ol>
*/
public static void main(String[] args) {
args = Args.argsOrDefault(args, "in/sklep.xml", "//towar[not(//cena > cena)]");
try {
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
InputSource inputSource = new InputSource(args[0]);
System.out.println("Obliczanie wyrazenia.");
String wynik = (String) xpath.evaluate(args[1], inputSource, XPathConstants.STRING);
System.out.println("Wynik wyrazenia to:");
System.out.println(wynik);
} catch(Exception e) {
System.err.println("Wyjatek: "+e.getMessage());
e.printStackTrace();
}
}
}
\ No newline at end of file
...@@ -6,6 +6,8 @@ import javax.xml.validation.Schema; ...@@ -6,6 +6,8 @@ import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory; import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator; import javax.xml.validation.Validator;
import common.MojErrorHandler;
public class WalidujWaluty2 { public class WalidujWaluty2 {
public static void main(String[] args) { public static void main(String[] args) {
String plikXML = "in/waluty_2022.xml"; String plikXML = "in/waluty_2022.xml";
......
...@@ -6,6 +6,8 @@ import org.w3c.dom.ls.DOMImplementationLS; ...@@ -6,6 +6,8 @@ import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput; import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSSerializer; import org.w3c.dom.ls.LSSerializer;
import common.MojErrorHandler;
import javax.xml.XMLConstants; import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilderFactory;
......
package zadania.zad01;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import common.Args;
import common.Statystyki;
public class StatystykiDOM {
public static void main(String[] args) {
try {
args = Args.argsOrDefault(args, "in/sklep.xml");
DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = fact.newDocumentBuilder();
Document doc = builder.parse(args[0]);
Statystyki statystyki = wyliczStatystyki(doc);
System.out.println(statystyki.wypisz());
} catch(Exception e) {
e.printStackTrace();
}
}
private static Statystyki wyliczStatystyki(Document doc) {
Statystyki statystyki = new Statystyki();
dodajDoStatystyk(statystyki, doc, 0);
return statystyki;
}
private static void dodajDoStatystyk(Statystyki stat, Node node, int glebokosc) {
/* To jest dobre, gdy sprawdzamy glebokosc dla jednego wezla.
* Przy przetwarzaniu rekurencyjnym lepiej przekazywac sobie glebokosc w parametrze.
int glebokosc = 0;
for(Node wgore = node; wgore != null; wgore = wgore.getParentNode()) {
glebokosc++;
} */
stat.zapamietajGlebokosc(glebokosc);
switch(node.getNodeType()) {
case Node.ELEMENT_NODE :
stat.dodajElement(node.getNodeName());
case Node.DOCUMENT_NODE :
for(Node dziecko = node.getFirstChild(); dziecko != null; dziecko = dziecko.getNextSibling())
dodajDoStatystyk(stat, dziecko, glebokosc+1);
break;
case Node.TEXT_NODE :
stat.dodajTekst(node.getNodeValue().length());
break;
}
}
}
package zadania.zad01;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import common.Args;
import common.Statystyki;
public class WypisywaczDOM {
public static void main(String[] args) {
try {
args = Args.argsOrDefault(args, "sklep.xml");
DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = fact.newDocumentBuilder();
Document doc = builder.parse(args[0]);
System.out.println("Wczytano dokument");
Statystyki statystyki = wyliczStatystyki(doc);
System.out.println(statystyki.wypisz());
} catch(Exception e) {
e.printStackTrace();
}
}
private static Statystyki wyliczStatystyki(Document doc) {
Statystyki statystyki = new Statystyki();
dodajDoStatystyk(statystyki, doc);
return statystyki;
}
private static void dodajDoStatystyk(Statystyki stat, Node nd) {
switch(nd.getNodeType()) {
case Node.DOCUMENT_NODE :
System.out.println("Jestem w korzeniu");
for(Node dziecko = nd.getFirstChild(); dziecko != null; dziecko = dziecko.getNextSibling())
dodajDoStatystyk(stat, dziecko);
break;
case Node.ELEMENT_NODE :
System.out.println("Jestem w elemencie "+nd.getNodeName());
for(Node dziecko = nd.getFirstChild(); dziecko != null; dziecko = dziecko.getNextSibling())
dodajDoStatystyk(stat, dziecko);
System.out.println("Koniec elementu "+nd.getNodeName());
break;
case Node.TEXT_NODE :
System.out.println("Jestem w tekście ["+nd.getNodeValue()+"] elementu "+
nd.getParentNode().getNodeName());
break;
}
}
}
package zadania.zad02;
import java.math.BigDecimal;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import common.Args;
public class NajtanszyTowarDOM {
public static void main(String[] args) {
try {
args = Args.argsOrDefault(args, "in/sklep.xml");
DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = fact.newDocumentBuilder();
Document doc = builder.parse(args[0]);
final Element sklep = doc.getDocumentElement();
final NodeList listaKategorii = sklep.getElementsByTagName("kategoria");
final NodeList listaTowarow = sklep.getElementsByTagName("towar");
for(int i = 0; i < listaKategorii.getLength(); ++i) {
final Element kategoria = (Element)listaKategorii.item(i);
final NodeList listaZNazwa = kategoria.getElementsByTagName("nazwa");
final Element elementNazwa = (Element)listaZNazwa.item(0);
final String nazwaKategorii = elementNazwa.getTextContent();
final String idKategorii = kategoria.getAttribute("id-kategorii");
System.out.println("\nKategoria "+nazwaKategorii + " (id="+idKategorii+")");
BigDecimal cenaMinimalna = new BigDecimal(Integer.MAX_VALUE);
String najtanszyTowar = null;
for(int j = 0; j < listaTowarow.getLength(); ++j) {
final Element towar = (Element)listaTowarow.item(j);
final String idKategoriiT = towar.getAttribute("id-kategorii");
if(idKategoriiT.equals(idKategorii)) {
final NodeList listaZNazwaT = towar.getElementsByTagName("nazwa");
final Element elementNazwaT = (Element)listaZNazwaT.item(0);
final String nazwaTowaru = elementNazwaT.getTextContent();
//final String nazwaTInaczej = towar.getElementsByTagName("nazwa").item(0).getTextContent();
//System.out.println("Towar: "+nazwaTowaru);
final NodeList listaZCena = towar.getElementsByTagName("cena");
final String cenaString = listaZCena.item(0).getTextContent();
final BigDecimal cena = new BigDecimal(cenaString);
//System.out.println(" cena = "+cena);
if(cena.compareTo(cenaMinimalna) < 0) {
cenaMinimalna = cena;
najtanszyTowar = nazwaTowaru;
}
}
}
System.out.println("Najtanszy towar: "+najtanszyTowar+", cena: "+cenaMinimalna);
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
package zadania.zad03;
import java.math.BigDecimal;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import common.Args;
public class NajtanszyTowarDOM_NS {
public static final String SKLEP_NS = "urn:sklep";
public static void main(String[] args) {
try {
args = Args.argsOrDefault(args, "in/sklep_ns.xml");
DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
fact.setNamespaceAware(true);
DocumentBuilder builder = fact.newDocumentBuilder();
Document doc = builder.parse(args[0]);
final Element sklep = doc.getDocumentElement();
final NodeList listaKategorii = sklep.getElementsByTagNameNS(SKLEP_NS, "kategoria");
final NodeList listaTowarow = sklep.getElementsByTagNameNS(SKLEP_NS, "towar");
for(int i = 0; i < listaKategorii.getLength(); ++i) {
final Element kategoria = (Element)listaKategorii.item(i);
final NodeList listaZNazwa = kategoria.getElementsByTagNameNS(SKLEP_NS, "nazwa");
final Element elementNazwa = (Element)listaZNazwa.item(0);
final String nazwaKategorii = elementNazwa.getTextContent();
final String idKategorii = kategoria.getAttributeNS(null, "id-kategorii");
System.out.println("\nKategoria "+nazwaKategorii + " (id="+idKategorii+")");
BigDecimal cenaMinimalna = new BigDecimal(Integer.MAX_VALUE);
String najtanszyTowar = null;
for(int j = 0; j < listaTowarow.getLength(); ++j) {
final Element towar = (Element)listaTowarow.item(j);
final String idKategoriiT = towar.getAttributeNS(null, "id-kategorii");
if(idKategoriiT.equals(idKategorii)) {
final NodeList listaZNazwaT = towar.getElementsByTagNameNS(SKLEP_NS, "nazwa");
final Element elementNazwaT = (Element)listaZNazwaT.item(0);
final String nazwaTowaru = elementNazwaT.getTextContent();
//final String nazwaTInaczej = towar.getElementsByTagName("nazwa").item(0).getTextContent();
//System.out.println("Towar: "+nazwaTowaru);
final NodeList listaZCena = towar.getElementsByTagNameNS(SKLEP_NS, "cena");
final String cenaString = listaZCena.item(0).getTextContent();
final BigDecimal cena = new BigDecimal(cenaString);
//System.out.println(" cena = "+cena);
if(cena.compareTo(cenaMinimalna) < 0) {
cenaMinimalna = cena;
najtanszyTowar = nazwaTowaru;
}
}
}
System.out.println("Najtanszy towar: "+najtanszyTowar+", cena: "+cenaMinimalna);
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
package zadania.zad04;
import java.io.FileOutputStream;
import java.math.BigDecimal;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSSerializer;
import common.Args;
public class DopiszBruttoDOM {
public static final String SKLEP_NS = "urn:sklep";
public static void main(String[] args) {
try {
args = Args.argsOrDefault(args, "in/sklep_ns.xml", "out/new_04.xml");
DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
fact.setNamespaceAware(true);
DocumentBuilder builder = fact.newDocumentBuilder();
Document doc = builder.parse(args[0]);
final Element sklep = doc.getDocumentElement();
final NodeList listaTowarow = sklep.getElementsByTagNameNS(SKLEP_NS, "towar");
for(int j = 0; j < listaTowarow.getLength(); ++j) {
final Element towar = (Element)listaTowarow.item(j);
final NodeList listaZCena = towar.getElementsByTagNameNS(SKLEP_NS, "cena");
final String cenaString = listaZCena.item(0).getTextContent();
final BigDecimal cena = new BigDecimal(cenaString);
final NodeList listaZVatem = towar.getElementsByTagNameNS(SKLEP_NS, "vat");
final Element elementVAT = (Element)listaZVatem.item(0);
final String vatString = elementVAT.getTextContent();
final BigDecimal vat = new BigDecimal(vatString);
// cena * (1 + vat / 100);
final BigDecimal cenaBrutto = cena.multiply(BigDecimal.ONE.add(vat.divide(new BigDecimal(100))));
final BigDecimal cenaBruttoZaokr = cenaBrutto.setScale(2, BigDecimal.ROUND_HALF_UP);
final String cenaBruttoString = cenaBruttoZaokr.toString();
final Element elementCenaBrutto = doc.createElementNS(SKLEP_NS, "cena-brutto");
//towar.appendChild(elementCenaBrutto);
towar.insertBefore(elementCenaBrutto, elementVAT);
final Text wciecie = doc.createTextNode("\n ");
towar.insertBefore(wciecie, elementVAT);
elementCenaBrutto.setTextContent(cenaBruttoString);
}
DOMImplementation domImpl = builder.getDOMImplementation();
DOMImplementationLS lsImpl = (DOMImplementationLS)domImpl.getFeature("LS", "3.0");
// if(lsImpl == null) { BLAD }
LSSerializer ser = lsImpl.createLSSerializer();
LSOutput output = lsImpl.createLSOutput();
output.setByteStream(new FileOutputStream(args[1]));
output.setEncoding("iso-8859-2");
ser.write(doc, output);
System.out.println("Gotowe");
} catch(Exception e) {
e.printStackTrace();
}
}
}
package zadania.zad05;
import java.math.BigDecimal;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import common.Args;
public class NajtanszyTowarXPath_A {
public static final String SKLEP_NS = "urn:sklep";
public static void main(String[] args) {
try {
args = Args.argsOrDefault(args, "in/sklep_ns.xml");
DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
fact.setNamespaceAware(true);
DocumentBuilder builder = fact.newDocumentBuilder();
XPathFactory xf = XPathFactory.newInstance();
XPath xpath = xf.newXPath();
xpath.setNamespaceContext(new SklepNSContext());
final Document doc = builder.parse(args[0]);
final Element sklep = doc.getDocumentElement();
final NodeList listaKategorii = sklep.getElementsByTagNameNS(SKLEP_NS, "kategoria");
for(int i = 0; i < listaKategorii.getLength(); ++i) {
final Element kategoria = (Element)listaKategorii.item(i);
final NodeList listaZNazwa = kategoria.getElementsByTagNameNS(SKLEP_NS, "nazwa");
final Element elementNazwa = (Element)listaZNazwa.item(0);
final String nazwaKategorii = elementNazwa.getTextContent();
final String idKategorii = kategoria.getAttributeNS(null, "id-kategorii");
System.out.println("\nKategoria "+nazwaKategorii + " (id="+idKategorii+")");
BigDecimal cenaMinimalna = new BigDecimal(Integer.MAX_VALUE);
String najtanszyTowar = null;
final NodeList listaTowarow = (NodeList)xpath.evaluate(
"//sklep:towar[@id-kategorii = '" + idKategorii + "']",
doc, XPathConstants.NODESET);
for(int j = 0; j < listaTowarow.getLength(); ++j) {
final Element towar = (Element)listaTowarow.item(j);
final NodeList listaZNazwaT = towar.getElementsByTagNameNS(SKLEP_NS, "nazwa");
final Element elementNazwaT = (Element)listaZNazwaT.item(0);
final String nazwaTowaru = elementNazwaT.getTextContent();
//final String nazwaTInaczej = towar.getElementsByTagName("nazwa").item(0).getTextContent();
//System.out.println("Towar: "+nazwaTowaru);
final NodeList listaZCena = towar.getElementsByTagNameNS(SKLEP_NS, "cena");
final String cenaString = listaZCena.item(0).getTextContent();
final BigDecimal cena = new BigDecimal(cenaString);
//System.out.println(" cena = "+cena);
if(cena.compareTo(cenaMinimalna) < 0) {
cenaMinimalna = cena;
najtanszyTowar = nazwaTowaru;
}
}
System.out.println("Najtanszy towar: "+najtanszyTowar+", cena: "+cenaMinimalna);
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
package zadania.zad05;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import common.Args;
public class NajtanszyTowarXPath_B {
public static final String SKLEP_NS = "urn:sklep";
public static void main(String[] args) {
try {
args = Args.argsOrDefault(args, "in/sklep_ns.xml");
DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
fact.setNamespaceAware(true);
DocumentBuilder builder = fact.newDocumentBuilder();
XPathFactory xf = XPathFactory.newInstance();
XPath xpath = xf.newXPath();
xpath.setNamespaceContext(new SklepNSContext());
final Document doc = builder.parse(args[0]);
final Element sklep = doc.getDocumentElement();
final NodeList listaKategorii = sklep.getElementsByTagNameNS(SKLEP_NS, "kategoria");
for(int i = 0; i < listaKategorii.getLength(); ++i) {
final Element kategoria = (Element)listaKategorii.item(i);
final NodeList listaZNazwa = kategoria.getElementsByTagNameNS(SKLEP_NS, "nazwa");
final Element elementNazwa = (Element)listaZNazwa.item(0);
final String nazwaKategorii = elementNazwa.getTextContent();
final String idKategorii = kategoria.getAttributeNS(null, "id-kategorii");
System.out.println("\nKategoria "+nazwaKategorii + " (id="+idKategorii+")");
final String sciezka = "//sklep:towar[@id-kategorii = '" + idKategorii + "'" +
" and not(//sklep:towar[@id-kategorii = '" + idKategorii + "']/sklep:cena < sklep:cena)]/sklep:nazwa";
System.out.println(sciezka);
// Przykladowo: //sklep:towar[@id-kategorii = 'herbata' and not(//sklep:towar[@id-kategorii = 'herbata']/sklep:cena < sklep:cena)]/nazwa
final String towar = xpath.evaluate(sciezka, doc);
System.out.println("Najtanszy towar: "+towar);
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
package zadania.zad05;
import java.util.Iterator;
import java.util.List;
import javax.xml.namespace.NamespaceContext;
public class SklepNSContext implements NamespaceContext {
private static final String SKLEP_PREFIX = "sklep";
private static final String SKLEP_URI = "urn:sklep";
@Override
public String getNamespaceURI(String prefix) {
if(SKLEP_PREFIX.equals(prefix))
return SKLEP_URI;
else
return null;
}
@Override
public String getPrefix(String namespaceURI) {
if(SKLEP_URI.equals(namespaceURI))
return SKLEP_PREFIX;
else
return null;
}
@Override
public Iterator getPrefixes(String namespaceURI) {
return List.of(SKLEP_PREFIX).iterator();
}
}
package zadania.zad05;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import common.Args;
public class SumaWszystkichCen {
public static void main(String[] args) {
try {
args = Args.argsOrDefault(args, "in/sklep.xml");
DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = fact.newDocumentBuilder();
XPathFactory xf = XPathFactory.newInstance();
XPath xpath = xf.newXPath();
Document doc = builder.parse(args[0]);
Double wynik = (Double)xpath.evaluate("sum(//cena)", doc, XPathConstants.NUMBER);
System.out.println(wynik);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (XPathExpressionException e) {
e.printStackTrace();
}
}
}
package zadania.zad06;
import java.math.BigDecimal;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import common.Args;
public class DopiszBruttoDOM_Transformer {
public static final String SKLEP_NS = "urn:sklep";
public static void main(String[] args) {
try {
args = Args.argsOrDefault(args, "in/sklep_ns.xml", "out/new_06.html", "in/sklep_html_ns.xsl");
DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
fact.setNamespaceAware(true);
DocumentBuilder builder = fact.newDocumentBuilder();
Document doc = builder.parse(args[0]);
final Element sklep = doc.getDocumentElement();
final NodeList listaTowarow = sklep.getElementsByTagNameNS(SKLEP_NS, "towar");
final int length = listaTowarow.getLength();
for(int j = 0; j < length; ++j) {
final Element towar = (Element)listaTowarow.item(j);
final NodeList listaZCena = towar.getElementsByTagNameNS(SKLEP_NS, "cena");
final String cenaString = listaZCena.item(0).getTextContent();
final BigDecimal cena = new BigDecimal(cenaString);
final NodeList listaZVatem = towar.getElementsByTagNameNS(SKLEP_NS, "vat");
final Element elementVAT = (Element)listaZVatem.item(0);
final String vatString = elementVAT.getTextContent();
final BigDecimal vat = new BigDecimal(vatString);
// cenaBrutto = cena * (1 + vat / 100);
final BigDecimal cenaBrutto = cena.multiply(BigDecimal.ONE.add(vat.divide(new BigDecimal(100))));
final BigDecimal cenaBruttoZaokr = cenaBrutto.setScale(2, BigDecimal.ROUND_HALF_UP);
final String cenaBruttoString = cenaBruttoZaokr.toString();
final Element elementCenaBrutto = doc.createElementNS(SKLEP_NS, "cena-brutto");
//towar.appendChild(elementCenaBrutto);
towar.insertBefore(elementCenaBrutto, elementVAT);
final Text wciecie = doc.createTextNode("\n ");
towar.insertBefore(wciecie, elementVAT);
elementCenaBrutto.setTextContent(cenaBruttoString);
}
final StreamSource xsl = new StreamSource(args[2]);
final TransformerFactory tf = TransformerFactory.newInstance();
final Transformer transformer = tf.newTransformer(xsl);
DOMSource src = new DOMSource(doc);
StreamResult res = new StreamResult(args[1]);
transformer.transform(src, res);
System.out.println("Gotowe");
} catch(Exception e) {
e.printStackTrace();
}
}
}
package zadania.zad06;
import java.math.BigDecimal;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.stream.StreamSource;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import common.Args;
public class NajtanszyTowarDOM_FiltrXSLT {
public static void main(String[] args) {
try {
// args = Args.argsOrDefault(args, "sklep.xml");
args = Args.argsOrDefault(args, "in/sklep.xml", "herbata");
// Stworzenie pustego drzewa dokumentu
final DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
final DocumentBuilder builder = fact.newDocumentBuilder();
final Document doc = builder.newDocument();
// Zrodlo XSLT, zrodlo dokumentu i cel przeksztalcenia (puste drzewo DOM)
final StreamSource xsltSrc = new StreamSource("in/sklep_filtr.xsl");
final StreamSource sklepSrc = new StreamSource(args[0]);
final DOMResult domRes = new DOMResult(doc);
// Transformer na podstawie XSLT, parametr, przeksztalcenie
final TransformerFactory tf = TransformerFactory.newInstance();
final Transformer transformer = tf.newTransformer(xsltSrc);
if(args.length >= 2)
transformer.setParameter("kategoria", args[1]);
transformer.transform(sklepSrc, domRes);
final Element sklep = doc.getDocumentElement();
final NodeList listaKategorii = sklep.getElementsByTagName("kategoria");
final NodeList listaTowarow = sklep.getElementsByTagName("towar");
for(int i = 0; i < listaKategorii.getLength(); ++i) {
final Element kategoria = (Element)listaKategorii.item(i);
final NodeList listaZNazwa = kategoria.getElementsByTagName("nazwa");
final Element elementNazwa = (Element)listaZNazwa.item(0);
final String nazwaKategorii = elementNazwa.getTextContent();
final String idKategorii = kategoria.getAttribute("id-kategorii");
System.out.println("\nKategoria "+nazwaKategorii + " (id="+idKategorii+")");
BigDecimal cenaMinimalna = new BigDecimal(Integer.MAX_VALUE);
String najtanszyTowar = null;
for(int j = 0; j < listaTowarow.getLength(); ++j) {
final Element towar = (Element)listaTowarow.item(j);
final String idKategoriiT = towar.getAttribute("id-kategorii");
if(idKategoriiT.equals(idKategorii)) {
final NodeList listaZNazwaT = towar.getElementsByTagName("nazwa");
final Element elementNazwaT = (Element)listaZNazwaT.item(0);
final String nazwaTowaru = elementNazwaT.getTextContent();
//final String nazwaTInaczej = towar.getElementsByTagName("nazwa").item(0).getTextContent();
//System.out.println("Towar: "+nazwaTowaru);
final NodeList listaZCena = towar.getElementsByTagName("cena");
final String cenaString = listaZCena.item(0).getTextContent();
final BigDecimal cena = new BigDecimal(cenaString);
//System.out.println(" cena = "+cena);
if(cena.compareTo(cenaMinimalna) < 0) {
cenaMinimalna = cena;
najtanszyTowar = nazwaTowaru;
}
}
}
System.out.println("Najtanszy towar: "+najtanszyTowar+", cena: "+cenaMinimalna);
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
package zadania.zad07;
import java.math.BigDecimal;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import common.Args;
import common.MojErrorHandler;
public class NajtanszyTowarDOM_NS {
public static final String SKLEP_NS = "urn:sklep";
public static void main(String[] args) {
try {
args = Args.argsOrDefault(args, "in/sklep_ns.xml", "in/sklep_ns.xsd");
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new StreamSource(args[1]));
DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
fact.setNamespaceAware(true);
fact.setSchema(schema);
DocumentBuilder builder = fact.newDocumentBuilder();
MojErrorHandler eh = new MojErrorHandler();
builder.setErrorHandler(eh);
Document doc = builder.parse(args[0]);
if(eh.czyBylBlad()) {
System.out.println("Blad podczas parsowania, nie dzialam dalej.");
return;
}
final Element sklep = doc.getDocumentElement();
final NodeList listaKategorii = sklep.getElementsByTagNameNS(SKLEP_NS, "kategoria");
final NodeList listaTowarow = sklep.getElementsByTagNameNS(SKLEP_NS, "towar");
for(int i = 0; i < listaKategorii.getLength(); ++i) {
final Element kategoria = (Element)listaKategorii.item(i);
final NodeList listaZNazwa = kategoria.getElementsByTagNameNS(SKLEP_NS, "nazwa");
final Element elementNazwa = (Element)listaZNazwa.item(0);
final String nazwaKategorii = elementNazwa.getTextContent();
final String idKategorii = kategoria.getAttributeNS(null, "id-kategorii");
System.out.println("\nKategoria "+nazwaKategorii + " (id="+idKategorii+")");
BigDecimal cenaMinimalna = new BigDecimal(Integer.MAX_VALUE);
String najtanszyTowar = null;
for(int j = 0; j < listaTowarow.getLength(); ++j) {
final Element towar = (Element)listaTowarow.item(j);
final String idKategoriiT = towar.getAttributeNS(null, "id-kategorii");
if(idKategoriiT.equals(idKategorii)) {
final NodeList listaZNazwaT = towar.getElementsByTagNameNS(SKLEP_NS, "nazwa");
final Element elementNazwaT = (Element)listaZNazwaT.item(0);
final String nazwaTowaru = elementNazwaT.getTextContent();
//final String nazwaTInaczej = towar.getElementsByTagName("nazwa").item(0).getTextContent();
//System.out.println("Towar: "+nazwaTowaru);
final NodeList listaZCena = towar.getElementsByTagNameNS(SKLEP_NS, "cena");
final String cenaString = listaZCena.item(0).getTextContent();
final BigDecimal cena = new BigDecimal(cenaString);
//System.out.println(" cena = "+cena);
if(cena.compareTo(cenaMinimalna) < 0) {
cenaMinimalna = cena;
najtanszyTowar = nazwaTowaru;
}
}
}
System.out.println("Najtanszy towar: "+najtanszyTowar+", cena: "+cenaMinimalna);
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
package zadania.zad08;
import java.io.FileOutputStream;
import java.math.BigDecimal;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSSerializer;
import common.Args;
import common.MojErrorHandler;
public class DopiszBruttoDOM_Walidacja {
public static final String SKLEP_NS = "urn:sklep";
public static void main(String[] args) {
try {
args = Args.argsOrDefault(args, "in/sklep_ns.xml", "out/new_08.xml", "in/sklep_ns.xsd");
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new StreamSource(args[2]));
DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
fact.setNamespaceAware(true);
fact.setSchema(schema);
DocumentBuilder builder = fact.newDocumentBuilder();
MojErrorHandler eh = new MojErrorHandler();
builder.setErrorHandler(eh);
Document doc = builder.parse(args[0]);
if(eh.czyBylBlad()) {
System.out.println("Blad podczas parsowania, nie dzialam dalej.");
return;
}
final Element sklep = doc.getDocumentElement();
final NodeList listaTowarow = sklep.getElementsByTagNameNS(SKLEP_NS, "towar");
for(int j = 0; j < listaTowarow.getLength(); ++j) {
final Element towar = (Element)listaTowarow.item(j);
final NodeList listaZCena = towar.getElementsByTagNameNS(SKLEP_NS, "cena");
final String cenaString = listaZCena.item(0).getTextContent();
final BigDecimal cena = new BigDecimal(cenaString);
final NodeList listaZVatem = towar.getElementsByTagNameNS(SKLEP_NS, "vat");
final Element elementVAT = (Element)listaZVatem.item(0);
final String vatString = elementVAT.getTextContent();
final BigDecimal vat = new BigDecimal(vatString);
// cena * (1 + vat / 100);
final BigDecimal cenaBrutto = cena.multiply(BigDecimal.ONE.add(vat.divide(new BigDecimal(100))));
final BigDecimal cenaBruttoZaokr = cenaBrutto.setScale(2, BigDecimal.ROUND_HALF_UP);
final String cenaBruttoString = cenaBruttoZaokr.toString();
final Element elementCenaBrutto = doc.createElementNS(SKLEP_NS, "cena-brutto");
//towar.appendChild(elementCenaBrutto);
towar.insertBefore(elementCenaBrutto, elementVAT);
final Text wciecie = doc.createTextNode("\n ");
towar.insertBefore(wciecie, elementVAT);
elementCenaBrutto.setTextContent(cenaBruttoString);
}
Validator validator = schema.newValidator();
MojErrorHandler eh2 = new MojErrorHandler();
validator.setErrorHandler(eh2);
validator.validate(new DOMSource(doc));
if(eh2.czyBylBlad()) {
System.out.println("Blad podczas walidacji, nie zapisuje pliku.");
return;
}
DOMImplementation domImpl = builder.getDOMImplementation();
DOMImplementationLS lsImpl = (DOMImplementationLS)domImpl.getFeature("LS", "3.0");
// if(lsImpl == null) { BLAD }
LSSerializer ser = lsImpl.createLSSerializer();
LSOutput output = lsImpl.createLSOutput();
output.setByteStream(new FileOutputStream(args[1]));
output.setEncoding("utf-8");
ser.write(doc, output);
System.out.println("Gotowe");
} catch(Exception e) {
e.printStackTrace();
}
}
}
package zadania.zad09.klasy_jaxb;
import java.util.ArrayList;
import java.util.List;
import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;
import jakarta.xml.bind.annotation.XmlSchemaType;
import jakarta.xml.bind.annotation.XmlType;
import javax.xml.datatype.XMLGregorianCalendar;
/**
* <p>Java class for anonymous complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* &lt;complexType>
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element name="data" type="{http://www.w3.org/2001/XMLSchema}date"/>
* &lt;element name="towar" type="{}TTowar" maxOccurs="unbounded" minOccurs="0"/>
* &lt;/sequence>
* &lt;/restriction>
* &lt;/complexContent>
* &lt;/complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"data",
"towar"
})
@XmlRootElement(name = "cennik")
public class Cennik {
@XmlElement(required = true)
@XmlSchemaType(name = "date")
protected XMLGregorianCalendar data;
protected List<TTowar> towar;
/**
* Gets the value of the data property.
*
* @return
* possible object is
* {@link XMLGregorianCalendar }
*
*/
public XMLGregorianCalendar getData() {
return data;
}
/**
* Sets the value of the data property.
*
* @param value
* allowed object is
* {@link XMLGregorianCalendar }
*
*/
public void setData(XMLGregorianCalendar value) {
this.data = value;
}
/**
* Gets the value of the towar property.
*
* <p>
* This accessor method returns a reference to the live list,
* not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB object.
* This is why there is not a <CODE>set</CODE> method for the towar property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getTowar().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link TTowar }
*
*
*/
public List<TTowar> getTowar() {
if (towar == null) {
towar = new ArrayList<TTowar>();
}
return this.towar;
}
}
package zadania.zad09.klasy_jaxb;
import java.util.ArrayList;
import java.util.List;
import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;
import jakarta.xml.bind.annotation.XmlType;
/**
* <p>Java class for anonymous complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* &lt;complexType>
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element ref="{}cennik" maxOccurs="unbounded"/>
* &lt;/sequence>
* &lt;/restriction>
* &lt;/complexContent>
* &lt;/complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"cennik"
})
@XmlRootElement(name = "cenniki")
public class Cenniki {
@XmlElement(required = true)
protected List<Cennik> cennik;
/**
* Gets the value of the cennik property.
*
* <p>
* This accessor method returns a reference to the live list,
* not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB object.
* This is why there is not a <CODE>set</CODE> method for the cennik property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getCennik().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Cennik }
*
*
*/
public List<Cennik> getCennik() {
if (cennik == null) {
cennik = new ArrayList<Cennik>();
}
return this.cennik;
}
}
package zadania.zad09.klasy_jaxb;
import javax.xml.namespace.QName;
import jakarta.xml.bind.JAXBElement;
import jakarta.xml.bind.annotation.XmlElementDecl;
import jakarta.xml.bind.annotation.XmlRegistry;
/**
* This object contains factory methods for each
* Java content interface and Java element interface
* generated in the zad09.klasy_jaxb package.
* <p>An ObjectFactory allows you to programatically
* construct new instances of the Java representation
* for XML content. The Java representation of XML
* content can consist of schema derived interfaces
* and classes representing the binding of schema
* type definitions, element declarations and model
* groups. Factory methods for each of these are
* provided in this class.
*
*/
@XmlRegistry
public class ObjectFactory {
private final static QName _TTekstTerm_QNAME = new QName("", "term");
private final static QName _TTekstLink_QNAME = new QName("", "link");
private final static QName _TTekstRem_QNAME = new QName("", "rem");
private final static QName _TTekstEm_QNAME = new QName("", "em");
private final static QName _TTekstBr_QNAME = new QName("", "br");
/**
* Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: zad09.klasy_jaxb
*
*/
public ObjectFactory() {
}
/**
* Create an instance of {@link TTekst }
*
*/
public TTekst createTTekst() {
return new TTekst();
}
/**
* Create an instance of {@link TTowar }
*
*/
public TTowar createTTowar() {
return new TTowar();
}
/**
* Create an instance of {@link Cenniki }
*
*/
public Cenniki createCenniki() {
return new Cenniki();
}
/**
* Create an instance of {@link Cennik }
*
*/
public Cennik createCennik() {
return new Cennik();
}
/**
* Create an instance of {@link Sklep }
*
*/
public Sklep createSklep() {
return new Sklep();
}
/**
* Create an instance of {@link TKategoria }
*
*/
public TKategoria createTKategoria() {
return new TKategoria();
}
/**
* Create an instance of {@link TTekst.Br }
*
*/
public TTekst.Br createTTekstBr() {
return new TTekst.Br();
}
/**
* Create an instance of {@link TTekst.Link }
*
*/
public TTekst.Link createTTekstLink() {
return new TTekst.Link();
}
/**
* Create an instance of {@link TTowar.CenaPromocyjna }
*
*/
public TTowar.CenaPromocyjna createTTowarCenaPromocyjna() {
return new TTowar.CenaPromocyjna();
}
/**
* Create an instance of {@link JAXBElement }{@code <}{@link TTekst }{@code >}}
*
*/
@XmlElementDecl(namespace = "", name = "term", scope = TTekst.class)
public JAXBElement<TTekst> createTTekstTerm(TTekst value) {
return new JAXBElement<TTekst>(_TTekstTerm_QNAME, TTekst.class, TTekst.class, value);
}
/**
* Create an instance of {@link JAXBElement }{@code <}{@link TTekst.Link }{@code >}}
*
*/
@XmlElementDecl(namespace = "", name = "link", scope = TTekst.class)
public JAXBElement<TTekst.Link> createTTekstLink(TTekst.Link value) {
return new JAXBElement<TTekst.Link>(_TTekstLink_QNAME, TTekst.Link.class, TTekst.class, value);
}
/**
* Create an instance of {@link JAXBElement }{@code <}{@link TTekst }{@code >}}
*
*/
@XmlElementDecl(namespace = "", name = "rem", scope = TTekst.class)
public JAXBElement<TTekst> createTTekstRem(TTekst value) {
return new JAXBElement<TTekst>(_TTekstRem_QNAME, TTekst.class, TTekst.class, value);
}
/**
* Create an instance of {@link JAXBElement }{@code <}{@link TTekst }{@code >}}
*
*/
@XmlElementDecl(namespace = "", name = "em", scope = TTekst.class)
public JAXBElement<TTekst> createTTekstEm(TTekst value) {
return new JAXBElement<TTekst>(_TTekstEm_QNAME, TTekst.class, TTekst.class, value);
}
/**
* Create an instance of {@link JAXBElement }{@code <}{@link TTekst.Br }{@code >}}
*
*/
@XmlElementDecl(namespace = "", name = "br", scope = TTekst.class)
public JAXBElement<TTekst.Br> createTTekstBr(TTekst.Br value) {
return new JAXBElement<TTekst.Br>(_TTekstBr_QNAME, TTekst.Br.class, TTekst.class, value);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment