XML Validator



XML Validator

当我在做uvm环境的generator脚本的时候,是通过XML来传递用户的定制参数的。比如cfg.xml的内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE top
SYSTEM "top.dtd.xml"
>
  <top>
    <timescale value="1ns/1ps" />
    <dut name="mydut" top_file="~/mydut.v" filelist="~/mydut.f" />
    <tbp name="demo" />
    <env name="bus" >
      <agent name="abc" active="1" off="0" >
	<interface name="aa" >
	  <ifclk name="clk" />
	  <ifrst name="rst" />
	  <signal name="ahb_burst" bind="ahb_burst_o" />
	  <signal name="ahb_valid" bind="ahb_valid_o" />
	</interface>
      </agent>
    </env>
  </top>

那么如何在第一时间去check用户输入的xml信息是否是正确的?这时候就用到了DTD文件作为一种validation的标准。假设top.dtd.xml的内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
  <!-- The top tag is the root tag. -->
<!ELEMENT top (timescale?,dut,tbp?,env) >

<!ELEMENT timescale EMPTY >
  <!ATTLIST timescale value CDATA #REQUIRED>

<!ELEMENT dut EMPTY>
  <!ATTLIST dut name CDATA #REQUIRED>
  <!ATTLIST dut top_file CDATA #REQUIRED>
  <!ATTLIST dut filelist CDATA #REQUIRED>


<!ELEMENT tbp EMPTY>
  <!ATTLIST tbp name CDATA #REQUIRED>

<!ELEMENT env (agent+)>
  <!ATTLIST env name CDATA #REQUIRED>

<!ELEMENT agent (interface)>
  <!ATTLIST agent name CDATA #REQUIRED>
  <!ATTLIST agent active CDATA #REQUIRED>
  <!ATTLIST agent off CDATA #REQUIRED>

<!ELEMENT interface (ifclk*,ifrst*,signal+)>
  <!ATTLIST interface name CDATA #REQUIRED>

<!ELEMENT ifclk EMPTY>
  <!ATTLIST ifclk name CDATA #REQUIRED>

<!ELEMENT ifrst EMPTY>
  <!ATTLIST ifrst name CDATA #REQUIRED>

<!ELEMENT signal EMPTY>
  <!ATTLIST signal name CDATA #REQUIRED>
  <!ATTLIST signal bind CDATA #IMPLIED>

我们用perl来处理XML文件的validation过程,如下:

use XML::LibXML;

my $parser = XML::LibXML->new;

$parser->validation(1);

$parser->parse_file("cfg.xml");