XSD不会返回DOMDocument的错误

时间:2013-03-06 15:46:45

标签: php xml xsd domdocument xsd-validation

我正在尝试使用带有DOMDocument的PHP在XSD中验证XML文件。 translation元素不得出现在我的XML中,但schemaValidate不会返回错误。我使用另一个验证工具进行了测试,并返回错误。我不明白为什么schemaValidate验证了错误的XML。

XSD的一部分

<xs:complexType name="CV">
  <xs:complexContent>
     <xs:restriction base="CE">
        <xs:sequence>
           <xs:element name="originalText" type="ED" minOccurs="0" maxOccurs="1">
              <xs:annotation>
                 <xs:documentation>
                    The text or phrase used as the basis for the coding.
                 </xs:documentation>
              </xs:annotation>
           </xs:element>
           <xs:element name="translation" type="CD" minOccurs="0" maxOccurs="0"/>
        </xs:sequence>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>

我的XML

<?xml version="1.0"?>
<CV><translation/></CV>

我的代码

$dom = new DOMDocument("1.0","UTF-8");
$dom->loadXML("<?xml version=\"1.0\"?>
<CV><translation></translation></CV>");
echo $dom->schemaValidate("TestClasses.xsd");

完整的XSD TestClasses.xsd

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

乍一看,这看起来像是架构验证器中的错误。 PHP manual建议(但没有明确说明)schemaValidate()使用libxml。并且libxml的XSD支持尚未完成。

对于它的价值,我注意到注释掉了

<xs:element name="translation" type="CD" 
            minOccurs="0" maxOccurs="0"/>

允许libxml在这里产生正确的结果,而不会使模式失效(据我在Saxon和Xerces J的快速测试中可以看出)。