Is there a published XML Schema Definition for PROPDESC files?

422 views Asked by At

In the MSDN documentation, I see fragments that look like XSD for the PROPDESC files for things like propertyDescriptionList attributes. Is the whole schema definition somewhere so I can validate my .propdesc file?

Here's the sample propdesc file from the Windows 7 SDK sample, for what that's worth. The sample defines a custom file type of .recipe.

<?xml version="1.0" encoding="utf-8"?>
<!--

    This propdesc file contains the descriptions of Recipe Sample custom properties.
    To register/unregister, use the PropertySchema SDK sample, or http://www.codeplex.com/prop.

-->
<schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://schemas.microsoft.com/windows/2006/propertydescription"
        schemaVersion="1.0">
  <propertyDescriptionList publisher="Microsoft" product="SampleRecipe">
    <propertyDescription name="Microsoft.SampleRecipe.Difficulty" formatID="{1794C9FE-74A9-497f-9C69-B31F03CE7EF9}" propID="100">
      <description>This property indicates the preparation difficulty of a recipe.</description>
      <searchInfo inInvertedIndex="true" isColumn="true" columnIndexType="OnDisk" mnemonics="RecipeDifficulty"/>
      <typeInfo type="String" multipleValues="false" isViewable="true" isQueryable="true"/>
      <labelInfo label="Recipe difficulty" invitationText="Specify recipe difficulty" />
      <displayInfo displayType="Enumerated" >
        <editControl control="DropList"/>
        <enumeratedList>
          <enum value="Easy" text="Easy" />
          <enum value="Medium" text="Medium" />
          <enum value="Hard" text="Hard" />
        </enumeratedList>
      </displayInfo>
    </propertyDescription>
  </propertyDescriptionList>
</schema>

Update: there's a note at MSDN requiring an xmlns reference to http://schemas.microsoft.com/windows/2006/propertydescription but that's just a placeholder URL as far as I can tell.

1

There are 1 answers

1
Jay Carlton On BEST ANSWER

I finally just created an empty xsd file in Visual Studio and started plugging in the various pieces. I got it working well enough, with the exception of missing simple types for upcase-uuid and canonical-name, which I don't see in the docs. Anyway, I was able to use the XML Plugin in Notepad++ to validate my .propdesc file against this schema, and it found an error for me, so I thought I'd share.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://schemas.microsoft.com/windows/2006/propertydescription"
    elementFormDefault="qualified"
    xmlns="http://schemas.microsoft.com/windows/2006/propertydescription"
    xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:element name="schema">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="propertyDescriptionList" minOccurs="1" maxOccurs="1"/>
      </xs:sequence>
      <xs:attribute name="schemaVersion"  type="xs:string"/>
    </xs:complexType>
  </xs:element>
  <!-- propertyDescriptionList -->
  <xs:element name="propertyDescriptionList">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="propertyDescription" minOccurs="1" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:attribute name="publisher" type="xs:string"/>
      <xs:attribute name="product"   type="xs:string"/>
    </xs:complexType>
  </xs:element>
  <!-- propertyDescription -->
  <xs:element name="propertyDescription">
    <xs:complexType>
      <xs:all>
        <xs:element name="description"    type="xs:string" minOccurs="0" maxOccurs="1"/>
        <xs:element ref="searchInfo"   minOccurs="1" maxOccurs="1"/>
        <xs:element ref="labelInfo"    minOccurs="0" maxOccurs="1"/>
        <xs:element ref="typeInfo"     minOccurs="0" maxOccurs="1"/>
        <xs:element ref="displayInfo"  minOccurs="0" maxOccurs="1"/>
      </xs:all>
      <!--<xs:attribute name="formatID"  type="upcase-uuid" use="required"/>-->
      <xs:attribute name="formatID"  type="xs:string" use="required"/>
      <xs:attribute name="propID"    type="xs:nonNegativeInteger" use="required"/>
      <!--<xs:attribute name="name"      type="canonical-name" use="required"/>-->
      <xs:attribute name="name"      type="xs:string" use="required"/>
    </xs:complexType>
  </xs:element>
  <!-- displayInfo -->
  <xs:element name="displayInfo">
    <xs:complexType>
      <xs:all>
        <xs:element name="stringFormat" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:attribute name="formatAs">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:enumeration value="General"/>
                  <xs:enumeration value="FileName"/>
                  <xs:enumeration value="FilePath"/>
                  <xs:enumeration value="Hyperlink"/>
                </xs:restriction>
              </xs:simpleType>
            </xs:attribute>
          </xs:complexType>
        </xs:element>
        <xs:element name="booleanFormat" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:attribute name="formatAs">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:enumeration value="YesNo"/>
                  <xs:enumeration value="OnOff"/>
                  <xs:enumeration value="TrueFalse"/>
                </xs:restriction>
              </xs:simpleType>
            </xs:attribute>
          </xs:complexType>
        </xs:element>
        <xs:element name="numberFormat" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:attribute name="formatAs">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:enumeration value="General"/>
                  <xs:enumeration value="Percentage"/>
                  <xs:enumeration value="ByteSize"/>
                  <xs:enumeration value="KBSize"/>
                  <xs:enumeration value="SampleSize"/>
                  <xs:enumeration value="Bitrate"/>
                  <xs:enumeration value="SampleRate"/>
                  <xs:enumeration value="FrameRate"/>
                  <xs:enumeration value="Pixels"/>
                  <xs:enumeration value="DPI"/>
                  <xs:enumeration value="Duration"/>
                </xs:restriction>
              </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="formatDurationAs">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:enumeration value="hh:mm"/>
                  <xs:enumeration value="hh:mm:ss"/>
                  <xs:enumeration value="hh:mm:ss.fff"/>
                </xs:restriction>
              </xs:simpleType>
            </xs:attribute>
          </xs:complexType>
        </xs:element>
        <xs:element name="dateTimeFormat" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:attribute name="formatAs">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:enumeration value="General"/>
                  <xs:enumeration value="Month"/>
                  <xs:enumeration value="YearMonth"/>
                  <xs:enumeration value="Year"/>
                </xs:restriction>
              </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="formatTimeAs">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:enumeration value="ShortTime"/>
                  <xs:enumeration value="LongTime"/>
                  <xs:enumeration value="HideTime"/>
                </xs:restriction>
              </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="formatDateAs">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:enumeration value="ShortDate"/>
                  <xs:enumeration value="LongDate"/>
                  <xs:enumeration value="HideDate"/>
                  <xs:enumeration value="RelativeShortDate"/>
                  <xs:enumeration value="RelativeLongDate"/>
                </xs:restriction>
              </xs:simpleType>
            </xs:attribute>
          </xs:complexType>
        </xs:element>
        <xs:element name="enumeratedList" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="enum" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:attribute name="value" type="xs:string" use="required"/>
                  <xs:attribute name="text" type="xs:string" use="required"/>
                </xs:complexType>
              </xs:element>
              <xs:element name="enumRange" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:attribute name="minValue" type="xs:string" use="required"/>
                  <xs:attribute name="setValue" type="xs:string"/>
                  <xs:attribute name="text" type="xs:string"/>
                </xs:complexType>
              </xs:element>
            </xs:sequence>

            <xs:attribute name="defaultText" type="xs:string"/>
            <xs:attribute name="useValueForDefault" type="xs:boolean"/>
          </xs:complexType>
        </xs:element>
        <xs:element name="drawControl" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:attribute name="control">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:enumeration value="Default"/>
                  <xs:enumeration value="MultiLineText"/>
                  <xs:enumeration value="MultiValueText"/>
                  <xs:enumeration value="PercentBar"/>
                  <xs:enumeration value="ProgressBar"/>
                  <xs:enumeration value="Rating"/>
                  <xs:enumeration value="StaticText"/>
                </xs:restriction>
              </xs:simpleType>
            </xs:attribute>
          </xs:complexType>
        </xs:element>
        <xs:element name="editControl" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:attribute name="control">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:enumeration value="Default"/>
                  <xs:enumeration value="Calendar"/>
                  <xs:enumeration value="CheckboxDropList"/>
                  <xs:enumeration value="DropList"/>
                  <xs:enumeration value="MultiLineText"/>
                  <xs:enumeration value="MultiValueText"/>
                  <xs:enumeration value="Rating"/>
                  <xs:enumeration value="Text"/>
                </xs:restriction>
              </xs:simpleType>
            </xs:attribute>
          </xs:complexType>
        </xs:element>
        <xs:element name="filterControl" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:attribute name="control">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:enumeration value="Default"/>
                  <xs:enumeration value="Calendar"/>
                  <xs:enumeration value="Rating"/>
                </xs:restriction>
              </xs:simpleType>
            </xs:attribute>
          </xs:complexType>
        </xs:element>
        <xs:element name="queryControl" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:attribute name="control">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:enumeration value="Default"/>
                  <xs:enumeration value="Boolean"/>
                  <xs:enumeration value="Calendar"/>
                  <xs:enumeration value="CheckboxDropList"/>
                  <xs:enumeration value="DropList"/>
                  <xs:enumeration value="MultiValueText"/>
                  <xs:enumeration value="NumericText"/>
                  <xs:enumeration value="Rating"/>
                  <xs:enumeration value="Text"/>
                </xs:restriction>
              </xs:simpleType>
            </xs:attribute>
          </xs:complexType>
        </xs:element>
      </xs:all>

      <xs:attribute name="defaultColumnWidth" type="xs:nonNegativeInteger" default="20"/>
      <xs:attribute name="displayType">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="String"/>
            <xs:enumeration value="Number"/>
            <xs:enumeration value="Boolean"/>
            <xs:enumeration value="DateTime"/>
            <xs:enumeration value="Enumerated"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>

      <xs:attribute name="alignment" default="Left">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="Left"/>
            <xs:enumeration value="Center"/>
            <xs:enumeration value="Right"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="relativeDescriptionType">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="General"/>
            <xs:enumeration value="Date"/>
            <xs:enumeration value="Size"/>
            <xs:enumeration value="Count"/>
            <xs:enumeration value="Revision"/>
            <xs:enumeration value="Length"/>
            <xs:enumeration value="Duration"/>
            <xs:enumeration value="Speed"/>
            <xs:enumeration value="Rate"/>
            <xs:enumeration value="Rating"/>
            <xs:enumeration value="Priority"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="defaultSortDirection" default="Ascending">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="Ascending"/>
            <xs:enumeration value="Descending"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <!-- searchInfo for Windows 7-->
  <xs:element name="searchInfo">
    <xs:complexType>
      <xs:attribute name="inInvertedIndex"    type="xs:boolean" default="false"/>
      <xs:attribute name="isColumn"           type="xs:boolean" default="false"/>
      <xs:attribute name="isColumnSparse"     type="xs:boolean" default="true">
        <xs:annotation>
          <xs:documentation>
            isColumnSparse: Default is true. If the property is multi-valued, this is always true.
          </xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="columnIndexType" default="OnDemand">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="NotIndexed"/>
            <xs:enumeration value="OnDisk"/>
            <xs:enumeration value="OnDiskAll"/>
            <xs:enumeration value="OnDiskVector"/>
            <xs:enumeration value="OnDemand"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="maxSize" type="xs:nonNegativeInteger" default="512"/>
      <xs:attribute name="mnemonics" type="xs:string"/>
    </xs:complexType>
  </xs:element>
  <!-- labelInfo -->
  <xs:element name="labelInfo">
    <xs:complexType>
      <xs:attribute name="label" type="xs:string"/>
      <xs:attribute name="sortDescription">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="General"/>
            <xs:enumeration value="AToZ"/>
            <xs:enumeration value="LowestHighest"/>
            <xs:enumeration value="OldestNewest"/>
            <xs:enumeration value="SmallestLargest"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="invitationText" type="xs:string"/>
      <xs:attribute name="hideLabel" type="xs:boolean" default="false"/>
    </xs:complexType>
  </xs:element>
  <!-- typeInfo for Windows 7-->
  <xs:element name="typeInfo">
    <xs:complexType>
      <xs:attribute name="type" default="Any">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="Any"/>
            <xs:enumeration value="Null"/>
            <xs:enumeration value="String"/>
            <xs:enumeration value="Boolean"/>
            <xs:enumeration value="Byte"/>
            <xs:enumeration value="Buffer"/>
            <xs:enumeration value="Int16"/>
            <xs:enumeration value="UInt16"/>
            <xs:enumeration value="Int32"/>
            <xs:enumeration value="UInt32"/>
            <xs:enumeration value="Int64"/>
            <xs:enumeration value="UInt64"/>
            <xs:enumeration value="Double"/>
            <xs:enumeration value="DateTime"/>
            <xs:enumeration value="Guid"/>
            <xs:enumeration value="Blob"/>
            <xs:enumeration value="Stream"/>
            <xs:enumeration value="Clipboard"/>
            <xs:enumeration value="Object"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="groupingRange">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="Discrete"/>
            <xs:enumeration value="Alphanumeric"/>
            <xs:enumeration value="Size"/>
            <xs:enumeration value="Date"/>
            <xs:enumeration value="Dynamic"/>
            <xs:enumeration value="Percent"/>
            <xs:enumeration value="Enumerated"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="isInnate" type="xs:boolean" default="false"/>
      <xs:attribute name="canBePurged" type="xs:boolean"/>
      <xs:attribute name="multipleValues" type="xs:boolean" default="false"/>
      <xs:attribute name="isGroup" type="xs:boolean" default="false"/>
      <xs:attribute name="aggregationType">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="Default"/>
            <xs:enumeration value="First"/>
            <xs:enumeration value="Sum"/>
            <xs:enumeration value="Average"/>
            <xs:enumeration value="DateRange"/>
            <xs:enumeration value="Union"/>
            <xs:enumeration value="Maximum"/>
            <xs:enumeration value="Minimum"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="isTreeProperty" type="xs:boolean" default="false"/>
      <xs:attribute name="isViewable" type="xs:boolean" default="false"/>
      <xs:attribute name="isQueryable" type="xs:boolean" default="false"/>
      <xs:attribute name="includeInFullTextQuery" type="xs:boolean" default="false"/>
      <xs:attribute name="searchRawValue" type="xs:boolean" default="false"/>
      <xs:attribute name="conditionType">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="None"/>
            <xs:enumeration value="String"/>
            <xs:enumeration value="Number"/>
            <xs:enumeration value="DateTime"/>
            <xs:enumeration value="Boolean"/>
            <xs:enumeration value="Size"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="defaultOperation">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="Equal"/>
            <xs:enumeration value="NotEqual"/>
            <xs:enumeration value="LessThan"/>
            <xs:enumeration value="GreaterThan"/>
            <xs:enumeration value="Contains"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>

</xs:schema>