2015-02-26 14:40

[PHP][Java][C#] 用 XSD 驗證 XML

menu_config.xml 要驗證的 XML
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <menu_config> 
  3.    <menu title="文章管理" url="~/Article" target="" allow=""> 
  4.        <submenu title="列表" url="~/Article/list" target="" allow=""/> 
  5.        <submenu/> 
  6.        <submenu title="新增" url="~/Article/add" target="" allow=""/> 
  7.    </menu> 
  8.    <menu/> 
  9.    <menu title="帳號管理" url="~/Admin"/> 
  10. </menu_config> 


menu_config.xsd 結構定義
  1. <?xml version="1.0"?> 
  2. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
  3.  
  4.    <xs:element name="menu_config"> 
  5.        <xs:complexType> 
  6.            <xs:sequence> 
  7.                <xs:element name="menu" type="menuType" minOccurs="0" maxOccurs="unbounded" /> 
  8.            </xs:sequence> 
  9.        </xs:complexType> 
  10.    </xs:element> 
  11.  
  12.    <xs:complexType name="menuType"> 
  13.        <xs:sequence> 
  14.            <xs:element name="submenu" type="menuType" minOccurs="0" maxOccurs="unbounded" /> 
  15.        </xs:sequence> 
  16.        <xs:attribute name="title" type="xs:string"/> 
  17.        <xs:attribute name="url" type="xs:string"/> 
  18.        <xs:attribute name="target" type="xs:string"/> 
  19.        <xs:attribute name="allow" type="xs:string"/> 
  20.    </xs:complexType> 
  21.  
  22. </xs:schema> 
element minOccurs
最少的出現次數,不設置為至少出現 1 次,設置 0 為可有可無。
element maxOccurs
最大的出現次數,設置 unbounded 為無上限。
attribute type
型別必須為 QName,常用的有 xs:string, xs:date, xs:int, xs:integer, xs:decimal, xs:boolean, xs:double, xs:float。


PHP
  1. $xmlFile = 'menu_config.xml'; 
  2. $xsdFile = 'menu_config.xsd'; 
  3.  
  4. /* 啟用自行錯誤處裡 */ 
  5. libxml_use_internal_errors(true); 
  6.  
  7. $xml = new DOMDocument(); 
  8. $xml->load($xmlFile); 
  9.  
  10. if (!$xml->schemaValidate($xsdFile)) { 
  11.    /* 顯示錯誤訊息 */ 
  12.    print_r(libxml_get_errors()); 
  13.    libxml_clear_errors(); 
  14. } 


C#
  1. var menuConfig = XDocument.Load("menu_config.xml"); 
  2. schemas.Add("", XmlReader.Create("menu_config.xsd")); 
  3.  
  4. menuConfig.Validate(schemas, (o, e) => { 
  5.    e.Message.Dump(); 
  6. }); 


Java
  1. import java.io.File; 
  2. import java.io.IOException; 
  3.  
  4. import javax.xml.XMLConstants; 
  5. import javax.xml.transform.stream.StreamSource; 
  6. import javax.xml.validation.Schema; 
  7. import javax.xml.validation.SchemaFactory; 
  8. import javax.xml.validation.Validator; 
  9.  
  10. import org.xml.sax.SAXException; 
  11.  
  12.  
  13. public class TestXsd { 
  14.  
  15.    public static void main(String[] args) { 
  16.        File xsd = new File("menu_config.xsd"); 
  17.        File xml = new File("menu_config.xml"); 
  18.  
  19.        try { 
  20.            SchemaFactory factory = SchemaFactory.newInstance( 
  21.                XMLConstants.W3C_XML_SCHEMA_NS_URI 
  22.            ); 
  23.            Schema schema = factory.newSchema(xsd); 
  24.            Validator validator = schema.newValidator(); 
  25.  
  26.            validator.validate(new StreamSource(xml)); 
  27.            System.out.println("xml is valid"); 
  28.        } 
  29.        catch (SAXException|IOException e) { 
  30.            System.out.println("Reason: " + e.getLocalizedMessage()); 
  31.        } 
  32.    } 
  33. } 



參考資料:
XML 結構描述項目 - MSDN
XML Schema Tutorial W3Schools

0 回應: