PHP libxml 中针对 XSD 的 XML 验证

Posted

技术标签:

【中文标题】PHP libxml 中针对 XSD 的 XML 验证【英文标题】:XML Validation against XSD in PHP libxml 【发布时间】:2014-01-23 20:23:42 【问题描述】:

我已经创建了一个如下所示的 xml

<Request>
    <RequestType>Logon</RequestType>
    <MobileId>23424</MobileId>
    <Password>123456Gg</Password>
</Request>

我的 xsd 文件就像下面的代码

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Request" type="RequestType"/>
<xsd:complexType name="RequestType">
    <xsd:sequence>
        <xsd:element name="RequestType">
            <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                    <xsd:enumeration value="Logon"/>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:element>
        <xsd:element name="MobileId" >
            <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                    <xsd:minLength value="0" />
                    <xsd:maxLength value="10" />
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:element>
        <xsd:element name="Password">
            <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                    <xsd:minLength value="0"/>
                    <xsd:maxLength value="255"/>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:element>
    </xsd:sequence>
</xsd:complexType>
</xsd:schema>

我使用 php 的 DOMDocument 的 schemaValidate 函数针对 xsd 验证 xml,它给出了以下错误

Fatal Error 4: Start tag expected, '<' not found on line 5 
Error 1872: The document has no document element. on line 0

但我已经在此链接W3C XML Schema Online validation 中测试了这两个文件(xml 和 xsd),并且它成功验证而没有显示任何错误。

我必须做什么才能在 php 中完成这项工作?

注意:我的 php libxml 版本是 2.7.8

【问题讨论】:

【参考方案1】:

只需关闭您的 xsd 文件:

</xsd:schema>

我现在试试,对我来说这很有效。

【讨论】:

对不起,我使用了有效的 xsd,它验证了提到的 url (xml schema validation) 中的 xml,这里我错过了包含 我让它工作了,我在这里做错的是,我使用了 $xml = simplexml_load_string(xmlstring);然后将该 xml 对象用于 DOMDocument::loadXML($xml),当我将 xmlstring 直接用于 DOMDocument 时,它工作正常 投票支持您回答自己的问题。 :p 嘿Kangu,你还做了什么来解决这个问题?我真的在这里挣扎。就像您描述的那样,如果我将 xml 硬编码到 loadXML 方法中,它就可以工作。如果我尝试将 xml 发布到 php 页面,我得到......“文档没有文档元素。”【参考方案2】:

dom 特别提供了两个函数来验证模式。 一种是给文件路径

$doc = new DOMDocument();
$doc->load('PATH TO XML');

$is_valid_xml = $doc->schemaValidate('PATH TO XSD');

否则你可以使用

$is_valid_xml = $doc->schemaValidateSource($source)

这个源应该是一个包含架构的字符串。 似乎您使用的是 schemaValidateSource 函数而不是 schemaValidate。 (有一次我被困在同一个地方) 干杯

【讨论】:

以上是关于PHP libxml 中针对 XSD 的 XML 验证的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ 针对 xsd 验证 xml

使用 php 针对 xsd 验证 xml 文件

在电子应用程序中使用 libxml-xsd 失败并出现绑定错误

针对同一 XML 模式 (XSD) 加快一批 XML 文件的 XML 模式验证

使用 XML::LibXML 遍历节点

通过 php 处理 XML 目录