[gupnp-av/wip/didl-lite-fragments] Make XSD loading faster.
- From: Krzesimir Nowak <krnowak src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gupnp-av/wip/didl-lite-fragments] Make XSD loading faster.
- Date: Wed, 24 Oct 2012 15:59:59 +0000 (UTC)
commit 1797eb5e661c8cdfb365e711bb405d7a1705f6bf
Author: Krzesimir Nowak <krnowak openismus com>
Date: Wed Oct 24 17:57:38 2012 +0200
Make XSD loading faster.
data/Makefile.am | 2 +-
data/av.xsd | 773 +++++++++++++++++++++++++++++++++++++++
data/simpledc20021212.xsd | 71 ++++
data/upnp.xsd | 841 +++++++++++++++++++++++++++++++++++++++++++
data/xml.xsd | 146 ++++++++
libgupnp-av/fragment-util.c | 43 ++-
6 files changed, 1871 insertions(+), 5 deletions(-)
---
diff --git a/data/Makefile.am b/data/Makefile.am
index 4f3f130..b224106 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -1 +1 @@
-dist_pkgdata_DATA = didl-lite-v2.xsd
+dist_pkgdata_DATA = didl-lite-v2.xsd upnp.xsd av.xsd xml.xsd simpledc20021212.xsd
diff --git a/data/av.xsd b/data/av.xsd
new file mode 100644
index 0000000..df7ffb0
--- /dev/null
+++ b/data/av.xsd
@@ -0,0 +1,773 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema xmlns:av="urn:schemas-upnp-org:av:av" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:schemas-upnp-org:av:av" version="3-20101231">
+ <xsd:annotation>
+ <xsd:documentation xml:lang="en">
+ Note that all schema supplied by the UPnP Forum AV WC committee are for informational use only and that the
+ standardized DCPs describe the normative requirements for these schema. Some schema provided do not necessarily
+ embody requirements regarding number of element occurrances allowed or their ordering.
+
+ Schema for UPnP A/V AV
+ </xsd:documentation>
+ </xsd:annotation>
+ <!--=============================-=============================-->
+ <!-- String Types -->
+ <!--=============================-=============================-->
+ <xsd:simpleType name="_pName.attributeOnly">
+ <xsd:annotation>
+ <xsd:documentation>
+ Dependent property name that has no associated independent property.
+ MAY include namespace prefix
+ MUST NOT include independent property name
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="([\i-[:]][\c-[:]]*:)? [\i-[:]][\c-[:]]*"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="_pName.elementIncluded">
+ <xsd:annotation>
+ <xsd:documentation>
+ General property name type
+ MUST include independent property name
+ MAY include namespace prefix
+ MAY include dependent property name
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="([\i-[:]][\c-[:]]*:)?[\i-[:]][\c-[:]]*(@[\i-[:]][\c-[:]]*)?"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="pName">
+ <xsd:union memberTypes="av:_pName.attributeOnly av:_pName.elementIncluded"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="pName.csv.1-n">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="(([\i-[:]][\c-[:]]*:)?[\i-[:]][\c-[:]]*(@[\i-[:]][\c-[:]])?)|(@[\i-[:]][\c-[:]])(,(([\i-[:]][\c-[:]]*:)?[\i-[:]][\c-[:]]*(@[\i-[:]][\c-[:]])?)|(@[\i-[:]][\c-[:]]))*"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="pName.csv.0-n">
+ <xsd:union memberTypes="av:pName.csv.1-n av:string.len.0"/>
+ </xsd:simpleType>
+ <!--
+ Use the following names in type names that represent individual
+ strings or delimited sequences of strings to distinguish the cases
+ where individual string components MUST be empty vs. MAY be empty vs.
+ MUST NOT be empty:
+
+ string.len.0
+ string.len.1_
+ string.len.0_
+ -->
+ <!--4,294,967,295-->
+ <xsd:simpleType name="_unsignedInt0">
+ <xsd:restriction base="xsd:token">
+ <xsd:pattern value="0*[0-9]{1,9}"/>
+ <xsd:pattern value="0*[1-3][0-9]{9}"/>
+ <xsd:pattern value="0*4[0-1][0-9]{8}"/>
+ <xsd:pattern value="0*42[0-8][0-9]{7}"/>
+ <xsd:pattern value="0*429[0-3][0-9]{6}"/>
+ <xsd:pattern value="0*4294[0-8][0-9]{5}"/>
+ <xsd:pattern value="0*42949[0-5][0-9]{4}"/>
+ <xsd:pattern value="0*429496[0-6][0-9]{3}"/>
+ <xsd:pattern value="0*4294967[0-1][0-9]{2}"/>
+ <xsd:pattern value="0*42949672[0-8][0-9]"/>
+ <xsd:pattern value="0*429496729[0-5]"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="_unsignedInt">
+ <xsd:restriction base="xsd:token">
+ <xsd:pattern value="0*(([0-9]{1,9})|([1-3][0-9]{9})|(4[0-1][0-9]{8})|(42[0-8][0-9]{7})|(429[0-3][0-9]{6})|(4294[0-8][0-9]{5})|(42949[0-5][0-9]{4})|(429496[0-6][0-9]{3})|(4294967[0-1][0-9]{2})|(42949672[0-8][0-9])|(429496729[0-5]))"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="string.len.0">
+ <xsd:restriction base="xsd:string">
+ <xsd:length value="0"/>
+ <xsd:whiteSpace value="collapse"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="string.len.1_">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="\s*\S+\s*"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="string.len.0_">
+ <xsd:restriction base="xsd:string"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="string.len.0_256">
+ <xsd:restriction base="xsd:string">
+ <xsd:maxLength value="256"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="NCName.len.1_31">
+ <xsd:restriction base="xsd:NCName">
+ <xsd:maxLength value="31"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="csv.0_.string.len.1_">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="([^,]|\\,)+(,([^,]|\\,)+)*"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="csv.0_.string.len.0_">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="([^,]|\\,)*(,([^,]|\\,)*)*"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="csv.1_.string.len.1_">
+ <xsd:restriction base="av:csv.0_.string.len.1_">
+ <xsd:minLength value="1"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="csv.1_.string.len.0_">
+ <xsd:restriction base="av:csv.0_.string.len.0_">
+ <xsd:minLength value="1"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="csv.4.string.len.1_">
+ <xsd:restriction base="av:csv.0_.string.len.1_">
+ <xsd:pattern value="([^,]|\\,)+(,([^,]|\\,)+){3}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="csv.4.string.len.0_">
+ <xsd:restriction base="av:csv.0_.string.len.0_">
+ <xsd:pattern value="([^,]|\\,)*(,([^,]|\\,)*){3}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="csv.0_.unsignedInteger">
+ <xsd:union memberTypes="av:csv.1_.unsignedInteger av:string.len.0"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="csv.1_.unsignedInteger">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="([0-9]+)(,[0-9]+)*"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="csv.1_Name">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="(\i\c*)(,(\i\c*))*"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="csv.1_.QName">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="([\i-[:]][\c-[:]]*:)?[\i-[:]][\c-[:]]*(,([\i-[:]][\c-[:]]*:)?[\i-[:]][\c-[:]]*)*"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="csv.1_.NCName">
+ <xsd:restriction base="av:csv.1_.QName">
+ <xsd:pattern value="[^:]+"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="csv.1_.colonDelimPairs">
+ <xsd:restriction base="xsd:token">
+ <xsd:pattern value="[^:]+:[^:]+(,[^:]+:[^:]+)*"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <!--=============================-=============================-->
+ <!-- Named Constants -->
+ <!--=============================-=============================-->
+ <xsd:simpleType name="string.const.ALL">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="ALL"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="string.const.ANY">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="ANY"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="string.const.AUTO">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="AUTO"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="string.const.DEFAULT">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="DEFAULT"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="string.const.FIRST-RUN">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="FIRST-RUN"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="string.const.HIGHEST">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="HIGHEST"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="string.const.INFINITY">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="INFINITY"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="string.const.LOWEST">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="LOWEST"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="string.const.NOT_IMPLEMENTED">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="NOT_IMPLEMENTED"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="string.const.NOW">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="NOW"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="string.const.OBJECTID">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="OBJECTID"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="string.const.PREDEF">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="PREDEF"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="string.const.REPEAT">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="REPEAT"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="string.const.UNBOUNDED">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="UNBOUNDED"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="string.const.UNKNOWN">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="UNKNOWN"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <!--=============================-=============================-->
+ <!-- Numeric Datatypes -->
+ <!--=============================-=============================-->
+ <xsd:simpleType name="unsignedInt.or.UNKNOWN">
+ <xsd:union memberTypes="xsd:unsignedInt av:string.const.UNKNOWN"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="unsignedInt.or.UNBOUNDED">
+ <xsd:union memberTypes="xsd:unsignedInt av:string.const.UNBOUNDED"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="positiveInt">
+ <xsd:restriction base="xsd:unsignedInt">
+ <xsd:minInclusive value="1"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="rational">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="-?[0-9]+(/0*[1-9][0-9]*)?"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="nonZeroRational">
+ <xsd:restriction base="av:rational">
+ <xsd:pattern value="[^/]*[1-9].*"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="long.-1_">
+ <xsd:restriction base="xsd:long">
+ <xsd:minInclusive value="-1"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="int.-1_">
+ <xsd:restriction base="xsd:int">
+ <xsd:minInclusive value="-1"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <!--=============================-=============================-->
+ <!-- Time Datatypes -->
+ <!--=============================-=============================-->
+ <!--
+ EBNF from ScheduledRecording:1 1.00
+
+ sched-start ::= date-time |
+ day-of-yr-time |
+ named-day-time |
+ T-labeled-time |
+ 'NOW'
+ start-range ::= (date-time|'NOW') '/' (date-time|'INFINITY')
+
+ duration ::= 'P' [n 'D'] time
+ duration-long ::= duration|'INFINITY'
+ duration-any ::= duration|'INFINITY'|'ANY'
+ duration-adj ::= ('+'|'-') duration
+ duration-range ::= duration '/' duration-long
+
+ date-time ::= yyyy '-' mm '-' dd T-labeled-time
+ day-of-yr-time ::= mm '-' dd T-labeled-time
+ named-day-time ::= named-day T-labeled-time
+
+ T-labeled-time ::= 'T' time [zone]
+ time ::= HH ':' MM ':' SS
+ zone ::= 'Z'|(('+'|'-') HH ':' MM)
+ month-day ::= mm '-' dd
+ named-day ::= 'MON'|'TUE'|'WED'|'THU'|'FRI'|'SAT'|'SUN'|
+ 'MON-FRI'|'MON-SAT'
+ n ::= 1*DIGIT (* non-negative integer *)
+ yyyy ::= 4DIGIT (* 0001-9999 *)
+ mm ::= 2DIGIT (* 01-12 *)
+
+ -->
+ <xsd:simpleType name="dateTime">
+ <xsd:annotation>
+ <xsd:documentation> Disallows fractional seconds </xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:dateTime">
+ <xsd:pattern value="[^\.]*"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="signedDuration">
+ <xsd:restriction base="xsd:token">
+ <xsd:pattern value="[-+]P([0-9]*D)?(2[0-3]|[0-1][0-9])(:[0-5][0-9]){2}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="unsignedDuration">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="P([0-9]*D)?(2[0-3]|[0-1][0-9])(:[0-5][0-9]){2}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="unsignedDuration.or.INFINITY">
+ <xsd:union memberTypes="av:unsignedDuration av:string.const.INFINITY"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="unsignedDuration.or.INFINITY.or.ANY">
+ <xsd:union memberTypes="av:unsignedDuration.or.INFINITY av:string.const.ANY"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="dayOfWeek.en.len.3">
+ <xsd:restriction base="xsd:token">
+ <xsd:enumeration value="SUN"/>
+ <xsd:enumeration value="MON"/>
+ <xsd:enumeration value="TUE"/>
+ <xsd:enumeration value="WED"/>
+ <xsd:enumeration value="THU"/>
+ <xsd:enumeration value="FRI"/>
+ <xsd:enumeration value="SAT"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <!-- Original duration definition in CDS:1 -->
+ <xsd:simpleType name="duration.cds1.decFrac">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[-+]?[0-9]+(:[0-5][0-9]){2}(\.[0-9]+)?"/>
+ </xsd:restriction>
+ <!-- Decimal fraction version -->
+ </xsd:simpleType>
+ <xsd:simpleType name="duration.cds1.numDenomFrac">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[-+]?[0-9]+(:[0-5][0-9]){2}(\.[0-9]+/[0-9]+)?"/>
+ </xsd:restriction>
+ <!-- Numerator/denominator fraction version -->
+ </xsd:simpleType>
+ <xsd:simpleType name="duration.cds1">
+ <xsd:union memberTypes="av:duration.cds1.decFrac av:duration.cds1.numDenomFrac"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="duration.cds1.or.NOT_IMPLEMENTED">
+ <xsd:union memberTypes="av:duration.cds1 av:string.const.NOT_IMPLEMENTED"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="daylightSaving.type">
+ <xsd:restriction base="xsd:string"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="startTimeUsage">
+ <xsd:restriction base="xsd:string"/>
+ </xsd:simpleType>
+ <!--=============================-=============================-->
+ <!-- Internet-related datatypes -->
+ <!--=============================-=============================-->
+ <xsd:simpleType name="domainName">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="([^\.]+\.)+[^\.]+\.?"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <!--===========================================================-->
+ <!-- -->
+ <!-- UPnP Specific Datatypes -->
+ <!-- -->
+ <!--===========================================================-->
+ <xsd:simpleType name="UDN">
+ <xsd:restriction base="xsd:anyURI">
+ <xsd:pattern value="uuid:.+"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <!--===========================================================-->
+ <!-- -->
+ <!-- AV Specific Datatypes -->
+ <!-- -->
+ <!--===========================================================-->
+ <xsd:simpleType name="sched-start">
+ <xsd:union memberTypes="av:dateTime xsd:string"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="dateTime-range">
+ <xsd:restriction base="xsd:token">
+ <xsd:pattern value=".+/.+"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="duration-range">
+ <xsd:restriction base="xsd:token">
+ <xsd:pattern value=".+/.+"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="radioBand.wc.values">
+ <xsd:restriction base="xsd:token">
+ <xsd:enumeration value="AM"/>
+ <xsd:enumeration value="FM"/>
+ <xsd:enumeration value="Shortwave"/>
+ <xsd:enumeration value="Internet"/>
+ <xsd:enumeration value="Satellite"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="radioBand.type">
+ <xsd:union memberTypes="av:radioBand.wc.values av:radioBand.vx.values"/>
+ </xsd:simpleType>
+ <!--=============================-=============================-->
+ <!-- Simple Common Types -->
+ <!--=============================-=============================-->
+ <xsd:simpleType name="_id.type">
+ <xsd:restriction base="xsd:string"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="_classNameBase.type">
+ <xsd:restriction base="xsd:NCName"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="_title.type">
+ <xsd:restriction base="xsd:string"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="stateUpdateID.type">
+ <xsd:restriction base="xsd:unsignedInt"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="string.domainNamePrefixed">
+ <xsd:annotation>
+ <xsd:documentation>
+ string.domainNamePrefixed == Domain Name Prefix type
+ This type is defined in ContentDirectory:2 and ScheduledRecording:1 as
+ string.domainNamePrefixed ::= domain-name '_' string
+ Therefore, the only requirement imposed here is the occurrence of at
+ least one underscore that has at least one character before and after it.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value=".+_.+"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <!--=============================-=============================-->
+ <!-- Storage Related Types -->
+ <!--=============================-=============================-->
+ <xsd:complexType name="storageMedium.type">
+ <xsd:attribute name="val" type="av:storageMedium.values" use="required"/>
+ </xsd:complexType>
+ <xsd:simpleType name="storageMedium.wc.values">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="UNKNOWN"/>
+ <xsd:enumeration value="DV"/>
+ <xsd:enumeration value="MINI-DV"/>
+ <xsd:enumeration value="VHS"/>
+ <xsd:enumeration value="W-VHS"/>
+ <xsd:enumeration value="S-VHS"/>
+ <xsd:enumeration value="D-VHS"/>
+ <xsd:enumeration value="VHSC"/>
+ <xsd:enumeration value="VIDEO8"/>
+ <xsd:enumeration value="HI8"/>
+ <xsd:enumeration value="CD-ROM"/>
+ <xsd:enumeration value="CD-DA"/>
+ <xsd:enumeration value="CD-R"/>
+ <xsd:enumeration value="CD-RW"/>
+ <xsd:enumeration value="VIDEO-CD"/>
+ <xsd:enumeration value="SACD"/>
+ <xsd:enumeration value="MD-AUDIO"/>
+ <xsd:enumeration value="MD-PICTURE"/>
+ <xsd:enumeration value="DVD-ROM"/>
+ <xsd:enumeration value="DVD-VIDEO"/>
+ <xsd:enumeration value="DVD+R"/>
+ <xsd:enumeration value="DVD-R"/>
+ <xsd:enumeration value="DVD+RW"/>
+ <xsd:enumeration value="DVD-RW"/>
+ <xsd:enumeration value="DVD-RAM"/>
+ <xsd:enumeration value="DVD-AUDIO"/>
+ <xsd:enumeration value="DAT"/>
+ <xsd:enumeration value="LD"/>
+ <xsd:enumeration value="HDD"/>
+ <xsd:enumeration value="MICRO-MV"/>
+ <xsd:enumeration value="NETWORK"/>
+ <xsd:enumeration value="NONE"/>
+ <xsd:enumeration value="NOT_IMPLEMENTED"/>
+ <xsd:enumeration value="SD"/>
+ <xsd:enumeration value="PC-CARD"/>
+ <xsd:enumeration value="MMC"/>
+ <xsd:enumeration value="CF"/>
+ <xsd:enumeration value="BD"/>
+ <xsd:enumeration value="MS"/>
+ <xsd:enumeration value="HD_DVD"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="storageMedium.values">
+ <xsd:union memberTypes="av:storageMedium.wc.values av:storageMedium.vx.values"/>
+ </xsd:simpleType>
+ <!--=============================-=============================-->
+ <!-- Program Related Types -->
+ <!--=============================-=============================-->
+ <xsd:simpleType name="SIprogramID.type">
+ <xsd:restriction base="av:csv.4.string.len.1_"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="SIseriesID.type">
+ <xsd:restriction base="av:csv.4.string.len.1_"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="programID_at_type.wc.values">
+ <xsd:restriction base="xsd:token">
+ <xsd:enumeration value="SI_PROGRAMID"/>
+ <xsd:enumeration value="SI_SERIESID"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="programID_at_type.values">
+ <xsd:union memberTypes="av:programID_at_type.wc.values av:programID_at_type.vx.values"/>
+ </xsd:simpleType>
+ <xsd:complexType name="programID.type">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="type" type="av:programID_at_type.values"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:simpleType name="channelID_at_type.wc.values">
+ <xsd:restriction base="xsd:token">
+ <xsd:enumeration value="ANALOG"/>
+ <xsd:enumeration value="DIGITAL"/>
+ <xsd:enumeration value="FREQUENCY"/>
+ <xsd:enumeration value="SI"/>
+ <xsd:enumeration value="LINE"/>
+ <xsd:enumeration value="NETWORK"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="channelID_at_type.values">
+ <xsd:union memberTypes="av:channelID_at_type.wc.values av:channelID_at_type.vx.values"/>
+ </xsd:simpleType>
+ <xsd:complexType name="channelID.type">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:token">
+ <xsd:attribute name="type" type="av:channelID_at_type.values" use="required"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:simpleType name="csv.1_.allowedUse">
+ <xsd:restriction base="xsd:token">
+ <xsd:pattern value="(PLAY|COPY|MOVE|UNKNOWN):(-1|[0-9]+)(,(PLAY|COPY|MOVE|UNKNOWN):(-1|[0-9]+))*"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:complexType name="programCode.type">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:token">
+ <xsd:attribute name="type" type="av:programCode_at_type.vd.values"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:simpleType name="rating_at_type.wc.values">
+ <xsd:restriction base="xsd:token">
+ <xsd:enumeration value="MPAA.ORG"/>
+ <xsd:enumeration value="RIAA.ORG"/>
+ <xsd:enumeration value="ESRB.ORG"/>
+ <xsd:enumeration value="TVGUIDELINES.ORG"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="rating_at_type.values">
+ <xsd:union memberTypes="av:rating_at_type.wc.values av:rating_at_type.vx.values"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="rating.MPAA.ORG.values">
+ <xsd:restriction base="xsd:token">
+ <xsd:enumeration value="G"/>
+ <xsd:enumeration value="PG"/>
+ <xsd:enumeration value="R"/>
+ <xsd:enumeration value="PG-13"/>
+ <xsd:enumeration value="R"/>
+ <xsd:enumeration value="NC-17"/>
+ <xsd:enumeration value="NR"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="rating.RIIA.ORG.values">
+ <xsd:restriction base="xsd:token">
+ <xsd:enumeration value=""/>
+ <xsd:enumeration value="PA-EC"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="rating.ESRB.ORG.values">
+ <xsd:restriction base="xsd:token">
+ <xsd:enumeration value="EC"/>
+ <xsd:enumeration value="E"/>
+ <xsd:enumeration value="E10+"/>
+ <xsd:enumeration value="T"/>
+ <xsd:enumeration value="M"/>
+ <xsd:enumeration value="AO"/>
+ <xsd:enumeration value="RP"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="rating.TVGUIDELINES.ORG.values">
+ <xsd:restriction base="xsd:token">
+ <xsd:enumeration value="TV-Y"/>
+ <xsd:enumeration value="TV-Y7"/>
+ <xsd:enumeration value="TV-Y7FV"/>
+ <xsd:enumeration value="TV-G"/>
+ <xsd:enumeration value="TV-PG"/>
+ <xsd:enumeration value="TV-14"/>
+ <xsd:enumeration value="TV-MA"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="rating.wc.values">
+ <xsd:union memberTypes="av:rating.MPAA.ORG.values av:rating.RIIA.ORG.values av:rating.ESRB.ORG.values av:rating.TVGUIDELINES.ORG.values"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="rating.values">
+ <xsd:union memberTypes="av:rating.wc.values av:rating.vx.values"/>
+ </xsd:simpleType>
+ <xsd:complexType name="rating.type">
+ <xsd:simpleContent>
+ <xsd:extension base="av:rating.values">
+ <xsd:attribute name="type" type="av:rating_at_type.values"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:simpleType name="FIRST-RUN.or.REPEAT">
+ <xsd:union memberTypes="av:string.const.FIRST-RUN av:string.const.REPEAT"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="ALL.or.FIRST-RUN.or.REPEAT">
+ <xsd:union memberTypes="av:string.const.ALL av:string.const.FIRST-RUN av:string.const.REPEAT"/>
+ </xsd:simpleType>
+ <!--=============================-=============================-->
+ <!-- User Channel and EPG Related Properties -->
+ <!--=============================-=============================-->
+ <xsd:complexType name="channelGroupName.type">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="id" type="av:string.domainNamePrefixed"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:simpleType name="stationCallSign.type">
+ <xsd:restriction base="xsd:string"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="signalStrength.wc.type">
+ <xsd:restriction base="xsd:int">
+ <xsd:minInclusive value="-1"/>
+ <xsd:maxInclusive value="100"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="signalStrength.type">
+ <xsd:union memberTypes="av:signalStrength.wc.type av:signalStrength.vx.type"/>
+ </xsd:simpleType>
+ <!--=============================-=============================-->
+ <!-- Bookmark Related Properties -->
+ <!--=============================-=============================-->
+ <xsd:simpleType name="serviceType">
+ <xsd:restriction base="xsd:token">
+ <xsd:pattern value="[^#:]{1,64}:[1-9][0-9]*"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="serviceId">
+ <xsd:restriction base="xsd:token">
+ <xsd:pattern value="[^:]{1,64}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:complexType name="deviceUDN.type">
+ <xsd:simpleContent>
+ <xsd:extension base="av:UDN">
+ <xsd:attribute name="serviceType" type="av:serviceType" use="required"/>
+ <xsd:attribute name="serviceId" type="av:serviceId" use="required"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <!--=================================-=================================-->
+ <!-- -->
+ <!-- Extension Master Datatypes -->
+ <!-- -->
+ <!--=================================-=================================-->
+ <xsd:simpleType name="extensions.simpleType.none">
+ <xsd:annotation>
+ <xsd:documentation xml:lang="en">
+ Use this type wherever extensions to a simpleType are allowed by the specification,
+ but they are disallowed for testing validation purposes.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:NCName">
+ <xsd:pattern value="[:]+"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:group name="extensions.elementType.none">
+ <xsd:annotation>
+ <xsd:documentation xml:lang="en">
+ Use this group wherever element extensions are allowed by the specification,
+ but they are disallowed for testing validation purposes.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:choice>
+ <xsd:any minOccurs="0" maxOccurs="0"/>
+ </xsd:choice>
+ </xsd:group>
+ <xsd:attributeGroup name="extensions.attributes.none">
+ <xsd:annotation>
+ <xsd:documentation xml:lang="en">
+ Use this group wherever attribute extensions are allowed by the specification,
+ but they are disallowed for testing validation purposes.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:attributeGroup>
+ <xsd:simpleType name="extensions.simpleType.any">
+ <xsd:annotation>
+ <xsd:documentation xml:lang="en">
+ Use this type wherever extensions to a simpleType are allowed by the specification,
+ and no constraints are imposed for testing validation purposes.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:union memberTypes="xsd:duration xsd:date xsd:dateTime xsd:time xsd:gDay xsd:gMonth xsd:gMonthDay xsd:gYear xsd:gYearMonth xsd:boolean xsd:float xsd:decimal xsd:double xsd:anyURI xsd:QName xsd:string xsd:base64Binary xsd:hexBinary"/>
+ </xsd:simpleType>
+ <xsd:group name="extensions.elementType.any">
+ <xsd:annotation>
+ <xsd:documentation xml:lang="en">
+ Use this group wherever element extensions are allowed by the specification,
+ and no constraints are imposed for testing validation purposes.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:choice>
+ <xsd:any minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:choice>
+ </xsd:group>
+ <xsd:attributeGroup name="extensions.attributes.any">
+ <xsd:annotation>
+ <xsd:documentation xml:lang="en">
+ Use this group wherever attribute extensions are allowed by the specification,
+ and no constraints are imposed for testing validation purposes.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:anyAttribute/>
+ </xsd:attributeGroup>
+ <!--===================================================================-->
+ <!-- -->
+ <!-- Extension Component Datatypes -->
+ <!-- -->
+ <!--===================================================================-->
+ <xsd:simpleType name="storageMedium.vx.values">
+ <xsd:restriction base="av:extensions.simpleType.any"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="programID_at_type.vx.values">
+ <xsd:restriction base="av:domainName"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="channelID_at_type.vx.values">
+ <xsd:restriction base="xsd:token"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="rating_at_type.vx.values">
+ <xsd:restriction base="av:string.domainNamePrefixed"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="rating.vx.values">
+ <xsd:restriction base="xsd:string"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="radioBand.vx.values">
+ <xsd:restriction base="xsd:token"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="signalStrength.vx.type">
+ <xsd:restriction base="xsd:int"/>
+ </xsd:simpleType>
+ <!--===================================================================-->
+ <!-- -->
+ <!-- Vendor-Defined Component Datatypes -->
+ <!-- -->
+ <!--===================================================================-->
+ <xsd:simpleType name="didl-lite_COLON_at_id.vd.type">
+ <xsd:restriction base="av:_id.type"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="srs_COLON_at_id.vd.type">
+ <xsd:restriction base="av:_id.type"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="programCode_at_type.vd.values">
+ <xsd:restriction base="av:string.domainNamePrefixed"/>
+ </xsd:simpleType>
+</xsd:schema>
\ No newline at end of file
diff --git a/data/simpledc20021212.xsd b/data/simpledc20021212.xsd
new file mode 100644
index 0000000..cade216
--- /dev/null
+++ b/data/simpledc20021212.xsd
@@ -0,0 +1,71 @@
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://purl.org/dc/elements/1.1/" targetNamespace="http://purl.org/dc/elements/1.1/" elementFormDefault="qualified" attributeFormDefault="unqualified">
+
+ <xs:annotation>
+ <xs:documentation xml:lang="en">
+ Simple DC XML Schema, 2002-10-09
+ by Pete Johnston (p johnston ukoln ac uk),
+ Carl Lagoze (lagoze cs cornell edu), Andy Powell (a powell ukoln ac uk),
+ Herbert Van de Sompel (hvdsomp yahoo com).
+ This schema defines terms for Simple Dublin Core, i.e. the 15
+ elements from the http://purl.org/dc/elements/1.1/ namespace, with
+ no use of encoding schemes or element refinements.
+ Default content type for all elements is xs:string with xml:lang
+ attribute available.
+
+ Supercedes version of 2002-03-12.
+ Amended to remove namespace declaration for http://www.w3.org/XML/1998/namespace namespace,
+ and to reference lang attribute via built-in xml: namespace prefix.
+ xs:appinfo also removed.
+ </xs:documentation>
+ </xs:annotation>
+
+ <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/03/xml.xsd">
+ </xs:import>
+
+ <xs:element name="title" type="elementType"/>
+ <xs:element name="creator" type="elementType"/>
+ <xs:element name="subject" type="elementType"/>
+ <xs:element name="description" type="elementType"/>
+ <xs:element name="publisher" type="elementType"/>
+ <xs:element name="contributor" type="elementType"/>
+ <xs:element name="date" type="elementType"/>
+ <xs:element name="type" type="elementType"/>
+ <xs:element name="format" type="elementType"/>
+ <xs:element name="identifier" type="elementType"/>
+ <xs:element name="source" type="elementType"/>
+ <xs:element name="language" type="elementType"/>
+ <xs:element name="relation" type="elementType"/>
+ <xs:element name="coverage" type="elementType"/>
+ <xs:element name="rights" type="elementType"/>
+
+ <xs:group name="elementsGroup">
+ <xs:sequence>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="title"/>
+ <xs:element ref="creator"/>
+ <xs:element ref="subject"/>
+ <xs:element ref="description"/>
+ <xs:element ref="publisher"/>
+ <xs:element ref="contributor"/>
+ <xs:element ref="date"/>
+ <xs:element ref="type"/>
+ <xs:element ref="format"/>
+ <xs:element ref="identifier"/>
+ <xs:element ref="source"/>
+ <xs:element ref="language"/>
+ <xs:element ref="relation"/>
+ <xs:element ref="coverage"/>
+ <xs:element ref="rights"/>
+ </xs:choice>
+ </xs:sequence>
+ </xs:group>
+
+ <xs:complexType name="elementType">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute ref="xml:lang" use="optional"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+</xs:schema>
\ No newline at end of file
diff --git a/data/upnp.xsd b/data/upnp.xsd
new file mode 100644
index 0000000..2242b6d
--- /dev/null
+++ b/data/upnp.xsd
@@ -0,0 +1,841 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema xmlns:av="urn:schemas-upnp-org:av:av" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:schemas-upnp-org:metadata-1-0/upnp/" elementFormDefault="qualified" attributeFormDefault="unqualified" version="4-20101231">
+ <xsd:annotation>
+ <xsd:documentation xml:lang="en">
+ Note that all schema supplied by the UPnP Forum AV WC committee are for informational use only and that the
+ standardized DCPs describe the normative requirements for these schema. Some schema provided do not necessarily
+ embody requirements regarding number of element occurrances allowed or their ordering.
+
+ </xsd:documentation>
+ </xsd:annotation>
+
+ <!-- This schema defines the upnp namespace tags that are employed
+ as descriptors by the DIDL-Lite schema -->
+ <xsd:import namespace="urn:schemas-upnp-org:av:av" schemaLocation="http://www.upnp.org/schemas/av/av.xsd"/>
+ <xsd:group name="class.group">
+ <xsd:sequence>
+ <xsd:element name="class" type="upnp:class.type"/>
+ </xsd:sequence>
+ </xsd:group>
+ <xsd:group name="upnpForContainer">
+ <xsd:choice>
+ <!--=============================-=============================-->
+ <!-- Base Properties -->
+ <!--=============================-=============================-->
+ <xsd:element name="searchClass" type="upnp:searchClass.type"/>
+ <xsd:element name="createClass" type="upnp:searchClass.type"/>
+ <xsd:element name="writeStatus" type="upnp:status.type"/>
+ <!--=============================-=============================-->
+ <!-- objectLink Properties -->
+ <!--=============================-=============================-->
+ <xsd:element name="objectLink" type="upnp:objectLink.type"/>
+ <xsd:element name="objectLinkRef" type="upnp:objectLinkRef.type"/>
+ <!--=============================-=============================-->
+ <!-- resExt Properties -->
+ <!--=============================-=============================-->
+ <xsd:element name="resExt" type="upnp:resExt.type"/>
+ <!--=============================-=============================-->
+ <!-- Contributor Related Properties -->
+ <!--=============================-=============================-->
+ <xsd:element name="artist" type="upnp:personWithRole.type"/>
+ <xsd:element name="actor" type="upnp:personWithRole.type"/>
+ <xsd:element name="author" type="upnp:personWithRole.type"/>
+ <xsd:element name="producer" type="upnp:person.type"/>
+ <xsd:element name="director" type="upnp:person.type"/>
+ <!--=============================-=============================-->
+ <!-- Affiliation Related Properties -->
+ <!--=============================-=============================-->
+ <xsd:element name="genre" type="upnp:genre.type"/>
+ <xsd:element name="album" type="av:_title.type"/>
+ <xsd:element name="playlist" type="av:_title.type"/>
+ <!--=============================-=============================-->
+ <!-- Associated Resources Properties -->
+ <!--=============================-=============================-->
+ <xsd:element name="albumArtURI" type="xsd:anyURI"/>
+ <xsd:element name="artistDiscographyURI" type="xsd:anyURI"/>
+ <xsd:element name="lyricsURI" type="xsd:anyURI"/>
+ <!-- Should have something restricting dc:relation to a URI. -->
+ <!--=============================-=============================-->
+ <!-- Storage Related Properties -->
+ <!--=============================-=============================-->
+ <xsd:element name="storageTotal" type="av:long.-1_"/>
+ <xsd:element name="storageUsed" type="av:long.-1_"/>
+ <xsd:element name="storageFree" type="av:long.-1_"/>
+ <xsd:element name="storageMaxPartition" type="av:long.-1_"/>
+ <xsd:element name="storageMedium" type="av:storageMedium.values"/>
+ <!--=============================-=============================-->
+ <!-- General Description Properties -->
+ <!-- (mainly for UI purposes) -->
+ <!--=============================-=============================-->
+ <xsd:element name="longDescription" type="xsd:string"/>
+ <xsd:element name="icon" type="xsd:anyURI"/>
+ <xsd:element name="region" type="xsd:string"/>
+ <xsd:element name="rights" type="xsd:string"/>
+ <xsd:element name="playbackCount" type="av:int.-1_"/>
+ <xsd:element name="lastPlaybackTime" type="upnp:qualifiedDateTime"/>
+ <xsd:element name="lastPlaybackPosition" type="av:unsignedDuration"/>
+ <xsd:element name="recordedStartDateTime" type="upnp:qualifiedDateTime"/>
+ <xsd:element name="recordedDuration" type="av:unsignedDuration"/>
+ <xsd:element name="recordedDayOfWeek" type="av:dayOfWeek.en.len.3"/>
+ <xsd:element name="srsRecordSchedule" type="av:srs_COLON_at_id.vd.type"/>
+ <xsd:element name="srsRecordTaskID" type="av:srs_COLON_at_id.vd.type"/>
+ <xsd:element name="recordable" type="xsd:boolean"/>
+ <!--=============================-=============================-->
+ <!-- Recorded Object Related Properties -->
+ <!--=============================-=============================-->
+ <xsd:element name="programTitle" type="xsd:string"/>
+ <xsd:element name="seriesTitle" type="xsd:string"/>
+ <xsd:element name="programID" type="av:programID.type"/>
+ <xsd:element name="seriesID" type="av:programID.type"/>
+ <xsd:element name="channelID" type="av:channelID.type"/>
+ <xsd:element name="episodeCount" type="xsd:unsignedInt"/>
+ <xsd:element name="episodeNumber" type="xsd:unsignedInt"/>
+ <xsd:element name="programCode" type="av:programCode.type"/>
+ <xsd:element name="rating" type="av:rating.type"/>
+ <xsd:element name="episodeType" type="av:FIRST-RUN.or.REPEAT"/>
+ <xsd:element name="programPreserved" type="upnp:programPreserved.Type"/>
+ <xsd:element name="preservedTimeRange" type="upnp:preservedTimeRange.Type"/>
+ <xsd:element name="programList" type="upnp:programList.Type"/>
+ <!--=============================-=============================-->
+ <!-- User Channel and EPG Related Properties -->
+ <!--=============================-=============================-->
+ <xsd:element name="channelGroupName" type="av:channelGroupName.type"/>
+ <xsd:element name="callSign" type="av:stationCallSign.type"/>
+ <xsd:element name="networkAffiliation" type="xsd:string"/>
+ <xsd:element name="serviceProvider" type="xsd:string"/>
+ <xsd:element name="price" type="upnp:price.type"/>
+ <xsd:element name="payPerView" type="xsd:boolean"/>
+ <xsd:element name="epgProviderName" type="xsd:string"/>
+ <xsd:element name="dateTimeRange" type="upnp:qualifiedDateTime-range"/>
+ <!--=============================-=============================-->
+ <!-- Radio Broadcast Properties -->
+ <!--=============================-=============================-->
+ <xsd:element name="radioCallSign" type="av:stationCallSign.type"/>
+ <xsd:element name="radioStationID" type="xsd:string"/>
+ <xsd:element name="radioBand" type="av:radioBand.type"/>
+ <!--=============================-=============================-->
+ <!-- Video Broadcast Properties -->
+ <!--=============================-=============================-->
+ <xsd:element name="channelNr" type="xsd:int"/>
+ <xsd:element name="channelName" type="xsd:string"/>
+ <xsd:element name="scheduledStartTime" type="upnp:qualifiedDateTime.ISO8601"/>
+ <xsd:element name="scheduledEndTime" type="upnp:qualifiedDateTime.ISO8601"/>
+ <xsd:element name="scheduledDuration" type="av:unsignedDuration"/>
+ <!--=============================-=============================-->
+ <!-- Physical Tuner Status-related Properties -->
+ <!--=============================-=============================-->
+ <xsd:element name="signalStrength" type="av:signalStrength.type"/>
+ <xsd:element name="signalLocked" type="xsd:boolean"/>
+ <xsd:element name="tuned" type="xsd:boolean"/>
+ <!--=============================-=============================-->
+ <!-- Bookmark Related Properties -->
+ <!--=============================-=============================-->
+ <xsd:element name="bookmarkID" type="av:didl-lite_COLON_at_id.vd.type"/>
+ <xsd:element name="bookmarkedObjectID" type="av:didl-lite_COLON_at_id.vd.type"/>
+ <xsd:element name="deviceUDN" type="av:deviceUDN.type"/>
+ <xsd:element name="stateVariableCollection" type="upnp:stateVariableCollection.type"/>
+ <!--=============================-=============================-->
+ <!-- Foreign Metadata Related Properties -->
+ <!--=============================-=============================-->
+ <xsd:element name="foreignMetadata" type="upnp:foreignMetadata.type"/>
+ <!--=============================-=============================-->
+ <!-- Miscellaneous Properties -->
+ <!--=============================-=============================-->
+ <xsd:element name="DVDRegionCode" type="xsd:int"/>
+ <xsd:element name="originalTrackNumber" type="xsd:int"/>
+ <xsd:element name="toc" type="xsd:string"/>
+ <xsd:element name="userAnnotation" type="xsd:string"/>
+ <!--=============================-=============================-->
+ <!-- Object Tracking Properties -->
+ <!--=============================-=============================-->
+ <xsd:element name="containerUpdateID" type="xsd:unsignedInt"/>
+ <xsd:element name="objectUpdateID" type="xsd:unsignedInt"/>
+ <xsd:element name="totalDeletedChildCount" type="xsd:unsignedInt"/>
+ <xsd:element name="segmentID" type="av:didl-lite_COLON_at_id.vd.type"/>
+ <!--=============================-=============================-->
+ <!-- Content Protection Properties -->
+ <!--=============================-=============================-->
+ <xsd:element name="objectOwner" type="upnp:owner.Type"/>
+ <xsd:element name="inclusionControl" type="upnp:inclusion.Type"/>
+ </xsd:choice>
+ </xsd:group>
+ <xsd:group name="upnpForItem">
+ <xsd:choice>
+ <xsd:group ref="upnp:upnpForContainer"/>
+ </xsd:choice>
+ </xsd:group>
+ <!--=============================-=============================-->
+ <!-- Base Properties -->
+ <!--=============================-=============================-->
+ <xsd:simpleType name="className.base.type">
+ <xsd:restriction base="xsd:NCName">
+ <xsd:minLength value="11"/>
+ <xsd:pattern value="object\.(item|container)(\.[\i-[:]][\c-[\.:]]*)*">
+ <xsd:annotation>
+ <xsd:documentation>
+ This pattern exactly matches the definition for class name syntax
+ given in CDS:2 Section C.1.1.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:pattern>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="className.wc.type">
+ <xsd:restriction base="xsd:NCName">
+ <xsd:enumeration value="object.item"/>
+ <xsd:enumeration value="object.item.imageItem"/>
+ <xsd:enumeration value="object.item.imageItem.photo"/>
+ <xsd:enumeration value="object.item.audioItem"/>
+ <xsd:enumeration value="object.item.audioItem.musicTrack"/>
+ <xsd:enumeration value="object.item.audioItem.audioBroadcast"/>
+ <xsd:enumeration value="object.item.audioItem.audioBook"/>
+ <xsd:enumeration value="object.item.videoItem"/>
+ <xsd:enumeration value="object.item.videoItem.movie"/>
+ <xsd:enumeration value="object.item.videoItem.videoBroadcast"/>
+ <xsd:enumeration value="object.item.videoItem.musicVideoClip"/>
+ <xsd:enumeration value="object.item.playlistItem"/>
+ <xsd:enumeration value="object.item.textItem"/>
+ <xsd:enumeration value="object.item.bookmarkItem"/>
+ <xsd:enumeration value="object.item.epgItem"/>
+ <xsd:enumeration value="object.item.epgItem.audioProgram"/>
+ <xsd:enumeration value="object.item.epgItem.videoProgram"/>
+ <xsd:enumeration value="object.container.person"/>
+ <xsd:enumeration value="object.container.person.musicArtist"/>
+ <xsd:enumeration value="object.container.playlistContainer"/>
+ <xsd:enumeration value="object.container.album"/>
+ <xsd:enumeration value="object.container.album.musicAlbum"/>
+ <xsd:enumeration value="object.container.album.photoAlbum"/>
+ <xsd:enumeration value="object.container.genre"/>
+ <xsd:enumeration value="object.container.genre.musicGenre"/>
+ <xsd:enumeration value="object.container.genre.movieGenre"/>
+ <xsd:enumeration value="object.container.channelGroup"/>
+ <xsd:enumeration value="object.container.channelGroup.audioChannelGroup"/>
+ <xsd:enumeration value="object.container.channelGroup.videoChannelGroup"/>
+ <xsd:enumeration value="object.container.epgContainer"/>
+ <xsd:enumeration value="object.container.storageSystem"/>
+ <xsd:enumeration value="object.container.storageVolume"/>
+ <xsd:enumeration value="object.container.storageFolder"/>
+ <xsd:enumeration value="object.container.bookmarkFolder"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="_className.type">
+ <xsd:union memberTypes="upnp:className.wc.type upnp:className.vx.type"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="className.type">
+ <xsd:restriction base="upnp:_className.type">
+ <!-- xxx - JGR
+ <xsd:pattern value="object\.(item|container)(\.[\i-[:]][\c-[\.:]]*)*"/>
+
+ Somehow including this pattern restriction rejects the <searchClass> element
+ but not the <class> element from the following snipet taken from the
+ ForeignMetadata Example #2. Even when the values are identical, the
+ <class> element validates and the <searchClass> element fails.
+
+ <upnp:class>object.container.storageFolder</upnp:class>
+ <upnp:searchClass includeDerived="false">
+ object.container.album.musicAlbum
+ </upnp:searchClass>
+
+ This inconsistent behavior needs to be investigated.
+-->
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:complexType name="class.type">
+ <xsd:simpleContent>
+ <xsd:extension base="upnp:className.type">
+ <xsd:attribute name="name" type="xsd:string"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="searchClass.type">
+ <xsd:simpleContent>
+ <xsd:extension base="upnp:class.type">
+ <xsd:attribute name="includeDerived" type="xsd:boolean" use="required"/>
+ </xsd:extension>
+ <!-- XXX - JGR: Should className.type be used rather than class.type> </-->
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="qualifiedDateTime">
+ <xsd:simpleContent>
+ <xsd:extension base="av:dateTime">
+ <xsd:attributeGroup ref="upnp:dateTime.attr.group"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="qualifiedDateTime-range">
+ <xsd:simpleContent>
+ <xsd:extension base="av:dateTime-range">
+ <xsd:attributeGroup ref="upnp:dateTime.attr.group"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:attributeGroup name="dateTime.attr.group">
+ <xsd:attribute name="daylightSaving" type="av:daylightSaving.type" use="optional"/>
+ </xsd:attributeGroup>
+ <xsd:simpleType name="status.type">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="WRITABLE"/>
+ <xsd:enumeration value="PROTECTED"/>
+ <xsd:enumeration value="NOT_WRITABLE"/>
+ <xsd:enumeration value="UNKNOWN"/>
+ <xsd:enumeration value="MIXED"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <!--=============================-=============================-->
+ <!-- Contributor Related Properties -->
+ <!--=============================-=============================-->
+ <xsd:complexType name="personWithRole.type">
+ <xsd:simpleContent>
+ <xsd:extension base="upnp:person.type">
+ <xsd:attribute name="role" type="xsd:string"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:simpleType name="person.type">
+ <xsd:restriction base="xsd:string"/>
+ </xsd:simpleType>
+ <!--=============================-=============================-->
+ <!-- Affiliation Related Properties -->
+ <!--=============================-=============================-->
+ <xsd:complexType name="genre.type">
+ <xsd:simpleContent>
+ <xsd:extension base="av:_title.type">
+ <xsd:attribute name="id" type="av:string.domainNamePrefixed"/>
+ <xsd:attribute name="extended" type="av:csv.1_.string.len.1_"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <!--=============================-=============================-->
+ <!-- Associated Resources Properties -->
+ <!--=============================-=============================-->
+ <!-- This section intentionally left blank -->
+ <!--=============================-=============================-->
+ <!-- Storage Related Properties -->
+ <!--=============================-=============================-->
+ <!-- This section intentionally left blank -->
+ <!--=============================-=============================-->
+ <!-- General Description Properties -->
+ <!-- (mainly for UI purposes) -->
+ <!--=============================-=============================-->
+ <!-- This section intentionally left blank -->
+ <!--=============================-=============================-->
+ <!-- Recorded Object Related Properties -->
+ <!--=============================-=============================-->
+ <!-- This section intentionally left blank -->
+ <!--=============================-=============================-->
+ <!-- User Channel and EPG Related Properties -->
+ <!--=============================-=============================-->
+ <xsd:complexType name="price.type">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:float">
+ <xsd:attribute name="currency" type="xsd:string" use="required"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <!--=============================-=============================-->
+ <!-- Radio Broadcast Properties -->
+ <!--=============================-=============================-->
+ <!--=============================-=============================-->
+ <!-- Video Broadcast Properties -->
+ <!--=============================-=============================-->
+ <xsd:complexType name="qualifiedDateTime.ISO8601">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attributeGroup ref="upnp:dateTime.attr.group"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="qualifiedDateTime.ISO8601andUsage">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attributeGroup ref="upnp:dateTime.attr.group"/>
+ <xsd:attribute name="usage" type="av:startTimeUsage"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <!--=============================-=============================-->
+ <!-- Physical Tuner Status-related Properties -->
+ <!--=============================-=============================-->
+ <!--=============================-=============================-->
+ <!-- Bookmark Related Properties -->
+ <!--=============================-=============================-->
+ <xsd:complexType name="stateVariableCollection.type">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attributeGroup ref="upnp:serviceAttrGrp"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:attributeGroup name="serviceAttrGrp">
+ <xsd:attribute name="serviceName" use="required">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="AVTransport"/>
+ <xsd:enumeration value="RenderingControl"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:attribute>
+ <xsd:attribute name="rcsInstanceType">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="pre-mix"/>
+ <xsd:enumeration value="post-mix"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:attribute>
+ </xsd:attributeGroup>
+ <xsd:complexType name="stateVariable.type">
+ <xsd:attribute name="variableName" type="xsd:string" use="required"/>
+ <xsd:attribute name="channel" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ <!--=============================-=============================-->
+ <!-- Foreign Metadata Related Properties -->
+ <!--=============================-=============================-->
+ <xsd:complexType name="foreignMetadata.type">
+ <xsd:annotation>
+ <xsd:documentation>
+ WC-defined structure for the Foreign Metadata property.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:group ref="upnp:fm.elements.group"/>
+ </xsd:sequence>
+ <xsd:attributeGroup ref="upnp:fm.attributes.group"/>
+ </xsd:complexType>
+ <xsd:attributeGroup name="fm.attributes.group">
+ <xsd:attribute name="type" use="required">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[a-zA-Z0-9_.]+"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:attribute>
+ <xsd:attributeGroup ref="upnp:fm.extensions.attributes.any"/>
+ </xsd:attributeGroup>
+ <xsd:group name="fm.elements.group">
+ <xsd:sequence>
+ <xsd:group ref="upnp:fm.elements.wc.group" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:group ref="upnp:fm.elements.vx.group" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:group>
+ <xsd:group name="fm.elements.vx.group">
+ <xsd:annotation>
+ <xsd:documentation>
+ Allow the Foreign Metadata tag to also hold vendor-defined elements.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:group>
+ <xsd:group name="fm.elements.wc.group">
+ <xsd:annotation>
+ <xsd:documentation>
+ Foreign Metadata sub-elements defined by the WC.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:choice>
+ <xsd:element name="fmId" type="xsd:string"/>
+ <xsd:element name="fmClass" type="xsd:string"/>
+ <xsd:element name="fmProvider" type="xsd:string"/>
+ <xsd:element name="fmBody" type="upnp:fm.elements.body.type"/>
+ </xsd:choice>
+ </xsd:group>
+ <xsd:complexType name="fm.elements.body.type">
+ <xsd:annotation>
+ <xsd:documentation>
+ Contains the actual foreign metadata.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:choice>
+ <xsd:element name="fmEmbeddedXML" type="upnp:fm.elements.body.embeddedXML.type"/>
+ <xsd:element name="fmEmbeddedString" type="upnp:fm.elements.body.embeddedString.type"/>
+ <xsd:element name="fmURI" type="upnp:fm.elements.body.uri.type"/>
+ </xsd:choice>
+ <xsd:attributeGroup ref="upnp:fm.attrs.bodyAttr.group"/>
+ <xsd:attributeGroup ref="upnp:fm.extensions.attributes.any"/>
+ </xsd:complexType>
+ <xsd:attributeGroup name="fm.attrs.bodyAttr.group">
+ <xsd:attribute name="xmlFlag" type="xsd:boolean" use="required"/>
+ <xsd:attribute name="mimeType">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[a-zA-Z0-9_./]+"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:attribute>
+ </xsd:attributeGroup>
+ <xsd:complexType name="fm.elements.body.embeddedXML.type">
+ <xsd:annotation>
+ <xsd:documentation>
+ Tags allowed inside a Foreign Metadata Body URI element.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:choice minOccurs="0" maxOccurs="unbounded">
+ <xsd:any namespace="##other" processContents="lax"/>
+ </xsd:choice>
+ </xsd:complexType>
+ <xsd:complexType name="fm.elements.body.embeddedString.type">
+ <xsd:annotation>
+ <xsd:documentation>
+ Tags allowed inside a Foreign Metadata Body URI element.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attributeGroup ref="upnp:fm.extensions.attributes.any"/>
+ </xsd:extension>
+ <!-- Placeholder for future WC attributes. -->
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="fm.elements.body.uri.type">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:anyURI">
+ <xsd:attributeGroup ref="upnp:fm.extensions.attributes.any"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:attributeGroup name="fm.extensions.attributes.any">
+ <xsd:attributeGroup ref="av:extensions.attributes.any"/>
+ </xsd:attributeGroup>
+ <!--===================================================================-->
+ <!-- -->
+ <!-- Extension Component Datatypes -->
+ <!-- -->
+ <!--===================================================================-->
+ <xsd:simpleType name="className.vx.type">
+ <xsd:restriction base="upnp:className.base.type"/>
+ </xsd:simpleType>
+ <xsd:simpleType name="foreignMetadata.element.vx.type">
+ <xsd:restriction base="xsd:string"/>
+ </xsd:simpleType>
+ <!--=============================-=============================-->
+ <!-- ObjectLink Related Properties -->
+ <!--=============================-=============================-->
+ <xsd:complexType name="objectLink.type">
+ <xsd:choice minOccurs="0" maxOccurs="unbounded">
+ <xsd:element name="title" type="xsd:string" maxOccurs="1"/>
+ <xsd:element name="startObject" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element name="mode" maxOccurs="1">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="Playback"/>
+ <xsd:enumeration value="Step"/>
+ <xsd:enumeration value="Index"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="relatedInfo" minOccurs="0">
+ <xsd:complexType mixed="true">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="role" use="required">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[A-Za-z0-9]+.*"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:attribute>
+ <xsd:attribute name="roleText" type="xsd:string" use="required"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="startInfo" minOccurs="0">
+ <xsd:complexType>
+ <xsd:attribute name="targetGroupID" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+ <xsd:attribute name="targetObjID" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="endAction" minOccurs="0">
+ <xsd:complexType>
+ <xsd:attribute name="action" use="required">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="Return"/>
+ <xsd:enumeration value="Branch"/>
+ <xsd:enumeration value="Stop"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:attribute>
+ <xsd:attribute name="targetGroupID" type="av:didl-lite_COLON_at_id.vd.type" use="optional"/>
+ <xsd:attribute name="targetObjID" type="av:didl-lite_COLON_at_id.vd.type" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ <xsd:attribute name="groupID" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+ <xsd:attribute name="headObjID" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+ <xsd:attribute name="nextObjID" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+ <xsd:attribute name="prevObjID" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+ </xsd:complexType>
+ <!--=============================-=============================-->
+ <!-- ObjectLinkRef Related Properties -->
+ <!--=============================-=============================-->
+ <xsd:complexType name="objectLinkRef.type">
+ <xsd:choice minOccurs="0" maxOccurs="1">
+ <xsd:element name="title" maxOccurs="1"/>
+ <xsd:element name="startObject" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element name="relatedInfo" minOccurs="0">
+ <xsd:complexType>
+ <xsd:attribute name="role" use="required">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[A-Za-z0-9]+.*"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:attribute>
+ <xsd:attribute name="roleText" type="xsd:string" use="required"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ <xsd:attribute name="groupID" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+ <xsd:attribute name="targetGroup" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+ <xsd:attribute name="targetObjID" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+ <xsd:attribute name="return" type="xsd:boolean" use="optional"/>
+ </xsd:complexType>
+ <!--=============================-=============================-->
+ <!-- resExt Related Properties -->
+ <!--=============================-=============================-->
+ <xsd:complexType name="resExt.type">
+ <xsd:annotation>
+ <xsd:documentation xml:lang="en">
+ Defines the permitted child elements of <resExt>. All children are optional and can be listed in any order in an unbounded manner.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:choice minOccurs="0" maxOccurs="unbounded">
+ <xsd:element name="segmentInfo" type="upnp:segmentInfo.Type"/>
+ <xsd:element name="clockSync" type="upnp:clockSync.Type"/>
+ <xsd:element name="DRMInfo" type="upnp:DRMInfo.Type"/>
+ <xsd:element name="isSyncAnchor" type="xsd:string"/>
+ <xsd:element name="componentInfo" type="upnp:componentInfo.Type"/>
+ </xsd:choice>
+ <xsd:attribute name="id" type="av:didl-lite_COLON_at_id.vd.type" use="required">
+ <xsd:annotation>
+ <xsd:documentation xml:lang="en">
+ Must be child of <item> or <container>. Value must match the res id value.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:attribute>
+ </xsd:complexType>
+ <!--=============================-=============================-->
+ <!-- segmentInfo Related Properties -->
+ <!--=============================-=============================-->
+ <xsd:complexType name="segmentInfo.Type">
+ <xsd:sequence>
+ <xsd:element name="timeRange">
+ <xsd:complexType>
+ <xsd:attribute name="start" type="av:duration.cds1.decFrac" use="required"/>
+ <xsd:attribute name="end" type="av:duration.cds1.decFrac" use="required"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="byteRange" minOccurs="0">
+ <xsd:complexType>
+ <xsd:attribute name="start" type="xsd:unsignedLong" use="required"/>
+ <xsd:attribute name="end" type="xsd:unsignedLong" use="required"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="frameRange" minOccurs="0">
+ <xsd:complexType>
+ <xsd:attribute name="start" type="xsd:unsignedLong" use="required"/>
+ <xsd:attribute name="end" type="xsd:unsignedLong" use="required"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute name="baseObjectID" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+ <xsd:attribute name="baseResID" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+ </xsd:complexType>
+ <!--=============================-=============================-->
+ <!-- clockSync Related Properties -->
+ <!--=============================-=============================-->
+ <xsd:complexType name="clockSync.Type">
+ <xsd:attribute name="deviceClockInfoID" type="xsd:string" use="required">
+ <xsd:annotation>
+ <xsd:documentation xml:lang="en">
+ Identifies the timestamp mechanism that will be used when the associated content-binary is streamed to the network by the device. Its value MUST equal the value of the associated deviceClockInfo id in a <Feature> element.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:attribute>
+ <xsd:attribute name="supportedTimestampsID" type="xsd:string" use="required">
+ <xsd:annotation>
+ <xsd:documentation xml:lang="en">
+ Identifies the timestamp mechanism that will be used when the associated content-binary is streamed to the network by the device. Its value MUST equal the value of the associated supportedTimestamps id in a <Features> element.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:attribute>
+ </xsd:complexType>
+ <!--=============================-=============================-->
+ <!-- DRMInfo Related Properties -->
+ <!--=============================-=============================-->
+ <xsd:complexType name="DRMInfoContent.Type">
+ <xsd:sequence>
+ <xsd:element name="foreignMetaData" type="upnp:foreignMetadata.type" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ <xsd:complexType name="DRMInfo.Type">
+ <xsd:sequence>
+ <xsd:element name="DRMInfo" type="upnp:DRMInfoContent.Type" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ <!--=============================-=============================-->
+ <!-- isSynchAnchor Related Properties -->
+ <!--=============================-=============================-->
+ <!--=============================-=============================-->
+ <!-- componentInfo Related Properties -->
+ <!--=============================-=============================-->
+ <!--=============================-=============================-->
+ <!-- Resource Encoding Characteristics Properties -->
+ <!--=============================-=============================-->
+ <xsd:complexType name="upnp.res.type" mixed="true">
+ <xsd:annotation>
+ <xsd:documentation>
+ A 'res' element indentifies a resource.
+ A resource is typically some type of binary asset,
+ such as a photo, song, video, etc.
+ A 'res' element contains a URI that identifies the resource
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:anyURI">
+ <xsd:attribute name="importUri" type="xsd:anyURI"/>
+ <xsd:attribute name="protocolInfo" type="xsd:string" use="required"/>
+ <xsd:attribute name="size" type="xsd:unsignedLong"/>
+ <xsd:attribute name="duration" type="av:duration.cds1"/>
+ <xsd:attribute name="bitrate" type="xsd:unsignedInt"/>
+ <xsd:attribute name="sampleFrequency" type="xsd:unsignedInt"/>
+ <xsd:attribute name="bitsPerSample" type="xsd:unsignedInt"/>
+ <xsd:attribute name="nrAudioChannels" type="xsd:unsignedInt"/>
+ <xsd:attribute name="resolution">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]+x[0-9]+"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:attribute>
+ <xsd:attribute name="colorDepth" type="xsd:unsignedInt"/>
+ <xsd:attribute name="tspec" type="av:string.len.0_256"/>
+ <xsd:attribute name="allowedUse" type="av:csv.1_.allowedUse"/>
+ <xsd:attribute name="validityStart" type="av:dateTime"/>
+ <xsd:attribute name="validityEnd" type="av:dateTime"/>
+ <xsd:attribute name="remainingTime" type="av:unsignedDuration"/>
+ <xsd:attribute name="usageInfo" type="xsd:string"/>
+ <xsd:attribute name="rightsInfoURI" type="xsd:anyURI"/>
+ <xsd:attribute name="contentInfoURI" type="xsd:anyURI"/>
+ <xsd:attribute name="recordQuality" type="av:csv.1_.colonDelimPairs"/>
+ <xsd:attribute name="protection" type="xsd:string"/>
+ <xsd:attributeGroup ref="upnp:dateTime.attr.group"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <!--transform names with extensions-->
+ <xsd:simpleType name="componentClass.Type">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value=".*"/>
+ <xsd:pattern value="Audio"/>
+ <xsd:pattern value="Video"/>
+ <xsd:pattern value="Caption"/>
+ <xsd:pattern value="Subtitle"/>
+ <xsd:pattern value="Unknown"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <!-- content.type -->
+ <xsd:complexType name="content.Type">
+ <xsd:sequence/>
+ <xsd:attribute name="MIMEType" type="xsd:string" use="required"/>
+ <xsd:attribute name="extendedType" type="xsd:string" use="required"/>
+ </xsd:complexType>
+ <!-- CompRes.type -->
+ <xsd:complexType name="compRes.Type" mixed="true">
+ <xsd:sequence>
+ <!-- we can't reffer directly to didl-lite:res.type since that creates a circular reference -->
+ <xsd:element name="isSynchAnchor" type="xsd:string" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="refUDN" type="xsd:string" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="refObjectID" type="xsd:string" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="refResID" type="xsd:string" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="res" type="upnp:upnp.res.type" minOccurs="0" maxOccurs="unbounded"/>
+ <!-- <xsd:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/> -->
+ </xsd:sequence>
+ </xsd:complexType>
+ <!--Component.type -->
+ <xsd:complexType name="component.Type">
+ <xsd:all minOccurs="1">
+ <xsd:element name="componentClass" type="upnp:componentClass.Type" maxOccurs="1" minOccurs="1"/>
+ <xsd:element name="contentType" type="upnp:content.Type" minOccurs="1" maxOccurs="1"/>
+ <xsd:element name="language" type="xsd:string" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="compRes" type="upnp:compRes.Type" minOccurs="0" maxOccurs="1"/>
+ </xsd:all>
+ <xsd:attribute name="componentID" type="xsd:string" use="required"/>
+ <xsd:attribute name="supportive" type="xsd:boolean" use="optional"/>
+ <xsd:attribute name="supportID" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ <!-- ComponentGroup.type-->
+ <xsd:complexType name="componentGroup.Type">
+ <xsd:sequence>
+ <xsd:element name="component" type="upnp:component.Type" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="groupID" type="xsd:string" use="required"/>
+ <xsd:attribute name="required" type="xsd:boolean" use="required"/>
+ </xsd:complexType>
+ <!-- ComponentInfo.type -->
+ <xsd:complexType name="componentInfo.Type">
+ <xsd:sequence>
+ <xsd:element name="componentGroup" type="upnp:componentGroup.Type" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="componentID" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ <!--=============================-=============================-->
+ <!-- programPreserved Related Properties -->
+ <!--=============================-=============================-->
+ <xsd:complexType name="programPreserved.Type">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="startTime" use="required"/>
+ <xsd:attribute name="startTimeDaylightSaving"/>
+ <xsd:attribute name="endTime"/>
+ <xsd:attribute name="endTimeDaylightSaving"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <!--=============================-=============================-->
+ <!-- programPreserved Related Properties -->
+ <!--=============================-=============================-->
+ <xsd:complexType name="preservedTimeRange.Type">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="startTime"/>
+ <xsd:attribute name="startTimeDaylightSaving"/>
+ <xsd:attribute name="endTime"/>
+ <xsd:attribute name="endTimeDaylightSaving"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <!--=============================-=============================-->
+ <!-- programList Related Properties -->
+ <!--=============================-=============================-->
+ <xsd:complexType name="programList.Type">
+ <xsd:sequence>
+ <xsd:element name="program" minOccurs="0" maxOccurs="unbounded">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="preserved"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ <!--=============================-=============================-->
+ <!-- Content Protection Feature Properties -->
+ <!--=============================-=============================-->
+ <xsd:complexType name="owner.Type">
+ <xsd:sequence>
+ <xsd:element name="role" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="lock" type="xsd:boolean" use="required"/>
+ </xsd:complexType>
+ <xsd:complexType name="inclusion.Type">
+ <xsd:sequence>
+ <xsd:element name="role" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+</xsd:schema>
\ No newline at end of file
diff --git a/data/xml.xsd b/data/xml.xsd
new file mode 100644
index 0000000..daecd6a
--- /dev/null
+++ b/data/xml.xsd
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace" xmlns:xs="http://www.w3.org/2001/XMLSchema" xml:lang="en">
+
+ <xs:annotation>
+ <xs:documentation>
+ See http://www.w3.org/XML/1998/namespace.html and
+ http://www.w3.org/TR/REC-xml for information about this namespace.
+
+ This schema document describes the XML namespace, in a form
+ suitable for import by other schema documents.
+
+ Note that local names in this namespace are intended to be defined
+ only by the World Wide Web Consortium or its subgroups. The
+ following names are currently defined in this namespace and should
+ not be used with conflicting semantics by any Working Group,
+ specification, or document instance:
+
+ base (as an attribute name): denotes an attribute whose value
+ provides a URI to be used as the base for interpreting any
+ relative URIs in the scope of the element on which it
+ appears; its value is inherited. This name is reserved
+ by virtue of its definition in the XML Base specification.
+
+ id (as an attribute name): denotes an attribute whose value
+ should be interpreted as if declared to be of type ID.
+ The xml:id specification is not yet a W3C Recommendation,
+ but this attribute is included here to facilitate experimentation
+ with the mechanisms it proposes. Note that it is _not_ included
+ in the specialAttrs attribute group.
+
+ lang (as an attribute name): denotes an attribute whose value
+ is a language code for the natural language of the content of
+ any element; its value is inherited. This name is reserved
+ by virtue of its definition in the XML specification.
+
+ space (as an attribute name): denotes an attribute whose
+ value is a keyword indicating what whitespace processing
+ discipline is intended for the content of the element; its
+ value is inherited. This name is reserved by virtue of its
+ definition in the XML specification.
+
+ Father (in any context at all): denotes Jon Bosak, the chair of
+ the original XML Working Group. This name is reserved by
+ the following decision of the W3C XML Plenary and
+ XML Coordination groups:
+
+ In appreciation for his vision, leadership and dedication
+ the W3C XML Plenary on this 10th day of February, 2000
+ reserves for Jon Bosak in perpetuity the XML name
+ xml:Father
+ </xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+ <xs:documentation>This schema defines attributes and an attribute group
+ suitable for use by
+ schemas wishing to allow xml:base, xml:lang, xml:space or xml:id
+ attributes on elements they define.
+
+ To enable this, such a schema must import this schema
+ for the XML namespace, e.g. as follows:
+ <schema . . .>
+ . . .
+ <import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="http://www.w3.org/2005/08/xml.xsd"/>
+
+ Subsequently, qualified reference to any of the attributes
+ or the group defined below will have the desired effect, e.g.
+
+ <type . . .>
+ . . .
+ <attributeGroup ref="xml:specialAttrs"/>
+
+ will define a type which will schema-validate an instance
+ element with any of those attributes</xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+ <xs:documentation>In keeping with the XML Schema WG's standard versioning
+ policy, this schema document will persist at
+ http://www.w3.org/2005/08/xml.xsd.
+ At the date of issue it can also be found at
+ http://www.w3.org/2001/xml.xsd.
+ The schema document at that URI may however change in the future,
+ in order to remain compatible with the latest version of XML Schema
+ itself, or with the XML namespace itself. In other words, if the XML
+ Schema or XML namespaces change, the version of this document at
+ http://www.w3.org/2001/xml.xsd will change
+ accordingly; the version at
+ http://www.w3.org/2005/08/xml.xsd will not change.
+ </xs:documentation>
+ </xs:annotation>
+
+ <xs:attribute name="lang">
+ <xs:annotation>
+ <xs:documentation>Attempting to install the relevant ISO 2- and 3-letter
+ codes as the enumerated possible values is probably never
+ going to be a realistic possibility. See
+ RFC 3066 at http://www.ietf.org/rfc/rfc3066.txt and the IANA registry
+ at http://www.iana.org/assignments/lang-tag-apps.htm for
+ further information.
+
+ The union allows for the 'un-declaration' of xml:lang with
+ the empty string.</xs:documentation>
+ </xs:annotation>
+ <xs:simpleType>
+ <xs:union memberTypes="xs:language">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value=""/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:union>
+ </xs:simpleType>
+ </xs:attribute>
+
+ <xs:attribute name="space">
+ <xs:simpleType>
+ <xs:restriction base="xs:NCName">
+ <xs:enumeration value="default"/>
+ <xs:enumeration value="preserve"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+
+ <xs:attribute name="base" type="xs:anyURI">
+ <xs:annotation>
+ <xs:documentation>See http://www.w3.org/TR/xmlbase/ for
+ information about this attribute.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+
+ <xs:attribute name="id" type="xs:ID">
+ <xs:annotation>
+ <xs:documentation>See http://www.w3.org/TR/xml-id/ for
+ information about this attribute.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+
+ <xs:attributeGroup name="specialAttrs">
+ <xs:attribute ref="xml:base"/>
+ <xs:attribute ref="xml:lang"/>
+ <xs:attribute ref="xml:space"/>
+ </xs:attributeGroup>
+
+</xs:schema>
\ No newline at end of file
diff --git a/libgupnp-av/fragment-util.c b/libgupnp-av/fragment-util.c
index 15a8734..32792ec 100644
--- a/libgupnp-av/fragment-util.c
+++ b/libgupnp-av/fragment-util.c
@@ -20,6 +20,8 @@
*/
#include <stdarg.h>
+#include <libxml/parserInternals.h>
+
#include "fragment-util.h"
#include "xml-util.h"
@@ -720,13 +722,46 @@ get_data_dir (void)
return datadir;
}
+static gchar *
+get_xsd_path (const gchar *path)
+{
+ return g_strdup_printf ("%s" G_DIR_SEPARATOR_S "%s",
+ get_data_dir (),
+ path);
+}
+
+static xmlParserInputPtr
+our_own_loader (const char *url,
+ const char *id,
+ xmlParserCtxtPtr context)
+{
+ gchar *basename;
+ gchar *path;
+ xmlParserInputPtr input;
+
+ g_debug ("URL: %s, ID: %s.", url, id);
+
+ basename = g_path_get_basename (url);
+ path = get_xsd_path (basename);
+ g_debug ("BASENAME: %s, PATH: %s", basename, path);
+ input = xmlNewInputFromFile (context, path);
+
+ g_free (basename);
+ g_free (path);
+
+ return input;
+}
+
XSDData *
fragment_util_get_didl_lite_xsd_data (void)
{
- gchar *path = g_strdup_printf
- ("%s" G_DIR_SEPARATOR_S "didl-lite-v2.xsd",
- get_data_dir ());
- XSDData *xsd_data = xsd_data_new (path);
+ gchar *path = get_xsd_path ("didl-lite-v2.xsd");
+ xmlExternalEntityLoader original_loader = xmlGetExternalEntityLoader ();
+ XSDData *xsd_data;
+
+ xmlSetExternalEntityLoader (our_own_loader);
+ xsd_data = xsd_data_new (path);
+ xmlSetExternalEntityLoader (original_loader);
g_free (path);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]