使用 XSD 為 XML 客製 Intellisense 輸入選單

同事負責的專案中有個自訂的 XML,主要用來紀錄一些不同 partner 的設定資訊。因為 partner 很多,常有新增或是調整這個 XML 的需求,為了避免人為輸入資料錯誤,想要在編輯 XML 時加上 intellisense 清單選擇提示

印象中我好像沒有這麼做過,但直覺上應該可行,畢竟 Visual Studio 編輯 web.config 也有類似功能,就來看看可以怎麼做吧

自訂 XML 內容

<?xml version="1.0" encoding="utf-8" ?>
<YowkoList>
  <YowkoItem YowkoCloth="1">
    <YowkoType>Paints</YowkoType>
  </YowkoItem>
</YowkoList>

加入 XSD

  1. XSD 可以從外部匯入也可以直接新增在專案中(視是否要與外部共用)
  2. 以新增至專案為例:新增位置 按右鍵 –> Add –> New Item…

    1addxsd

  3. XML Schema –> 給個名字

    2xsdname

  4. 預設畫面

    3designer

編輯 XSD

  1. 使用 XML Editor 來編輯

    4xmleditor

  2. 預設 XSD 內容

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema id="Test"
        targetNamespace="http://tempuri.org/Test.xsd"
        elementFormDefault="qualified"
        xmlns="http://tempuri.org/Test.xsd"
        xmlns:mstns="http://tempuri.org/Test.xsd"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
    >
    </xs:schema>
    
  3. idtargetNamespacexmlnsxmlns:mstns 修改易於識別的內容

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema id="YowkoSchema"
        targetNamespace="http://yowko.com/YowkoSchema.xsd"
        elementFormDefault="qualified"
        xmlns="http://yowko.com/YowkoSchema.xsd"
        xmlns:mstns="http://yowko.com/YowkoSchema.xsd"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
    >
    </xs:schema>
    
    • id 實測下不影響功能
    • targetNamespace 則需與 xmlns:xs 內容需一致
  4. 加上 XSD 定義

    • 定義 intellisense 選單

      清單叫為 YowkoCloth,是 integer 格式

      <xs:simpleType name="YowkoCloth">
          <xs:restriction base="xs:integer">
          <xs:enumeration value="1"></xs:enumeration>
          <xs:enumeration value="5"></xs:enumeration>
          <xs:enumeration value="10"></xs:enumeration>
          <xs:enumeration value="11"></xs:enumeration>
          </xs:restriction>
      </xs:simpleType>
      
    • 定義 intellisense 選單使用方式

      定義為 YowkoElement 中的 YowkoCloth attribute

      <xs:complexType name="YowkoElement">
          <xs:attribute name="YowkoCloth" type="YowkoSize" use="required"></xs:attribute>
      </xs:complexType>
      
    • 定義 YowkoElement 使用方式

      根物件 YowkoList 有個類型為 YowkoElementYowkoItem element

      <xs:element name="YowkoList">
          <xs:complexType>
          <xs:sequence>
              <xs:element name="YowkoItem" type="YowkoElement" minOccurs="0" maxOccurs="unbounded">
              </xs:element>
          </xs:sequence>
          </xs:complexType>
      </xs:element>
      
    • 完整 XSD

      <?xml version="1.0" encoding="utf-8"?>
      <xs:schema id="YowkoSchema"
              targetNamespace="http://yowko.com/YowkoSchema.xsd"
              elementFormDefault="qualified"
              xmlns="http://yowko.com/YowkoSchema.xsd"
              xmlns:mstns="http://yowko.com/YowkoSchema.xsd"
              xmlns:xs="http://www.w3.org/2001/XMLSchema"
      >
          <xs:simpleType name="YowkoSize">
              <xs:restriction base="xs:integer">
              <xs:enumeration value="1"></xs:enumeration>
              <xs:enumeration value="5"></xs:enumeration>
              <xs:enumeration value="10"></xs:enumeration>
              <xs:enumeration value="11"></xs:enumeration>
              </xs:restriction>
          </xs:simpleType>
                      <xs:complexType name="YowkoElement">
              <xs:sequence>
              <xs:element name="YowkoType" type="xs:string"></xs:element>
              </xs:sequence>
              <xs:attribute name="YowkoCloth" type="YowkoSize" use="required"></xs:attribute>
          </xs:complexType>
                      <xs:element name="YowkoList">
              <xs:complexType>
              <xs:sequence>
                  <xs:element name="YowkoItem" type="YowkoElement" minOccurs="0" maxOccurs="unbounded">
                  </xs:element>
              </xs:sequence>
              </xs:complexType>
          </xs:element>
      </xs:schema>
      

XML 加上使用自訂 XSD

  1. 在根 element 加上 namesspace 引用

    xmlns="http://yowko.com/YowkoSchema.xsd"
    
  2. 完整 XML

    <?xml version="1.0" encoding="utf-8" ?>
    <YowkoList xmlns="http://yowko.com/YowkoSchema.xsd">
        <YowkoItem YowkoCloth="1">
            <YowkoType>Paints</YowkoType>
        </YowkoItem>
    </YowkoList>
    

實際效果

  1. 編輯提示(會出現提示選單供選擇)

    5intellisenseresult

  2. 輸入 < 也會有 element 提示

    8element

  3. 輸入未在清單之值會出現錯誤提示

    6xsderror

  4. 輸入未在清單之值也會出現在 build warning 中

    7xsdwarning

心得

實際流程不多,但網路上資源並不好找,我猜想可能對這個功能的需求不多,畢竟編輯 XML 的大多數是工程師,XML 格式是固定的,與其花這個時間做 XML intellisense 大家應該都會選擇把時間拿出開發其他功能吧

參考資訊

  1. XML 編輯器 IntelliSense 功能
  2. Intellisense for custom XML in Visual Studio