winapixsdwindows-shellwindows-searchfile-properties

Is there a published XML Schema Definition for PROPDESC files?


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.


Solution

  • 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>