在 PHP 中使用 RNG 验证 XML

Validate XML with RNG in PHP

提问人:Pick 提问时间:8/30/2023 更新时间:8/30/2023 访问量:28

问:

我想根据 RNG 架构验证 XML 文件。为此,我使用“DOMDocument relaxNGValidate”功能。我希望显示所有错误。但是我开发的代码只显示第一个。我已经搜索过,但找不到如何显示所有错误。

下面是PHP代码:

<?php
libxml_use_internal_errors(true);

// Create a new DOMDocument
$doc = new DOMDocument;

// Load XML 
$doc->load('test.xml');

// Validate XML against RNG
if ($doc->relaxNGValidate('test.rng')) {
    echo "Valid File.";
} else {
    $errors = libxml_get_errors();
    foreach ($errors as $error) {
        echo "Erreur : " . $error->message . " (ligne " . $error->line . ")\n";
    }
    libxml_clear_errors();
}

libxml_use_internal_errors(false);
?>

仅显示第一个错误。 下面是一个示例 XML 文件:

<?xml version="1.0"?>
<collegqe>
    <rollno>
        <name>John Smith</name>
        <subject>Web</subject>
    </rollno>
    <rollno>
        <nameq>John Doe</nameq>
        <subject>CSE</subject>
    </rollno>
</collegqe> 

和 RNG 文件:

<grammar xmlns="http://relaxng.org/ns/structure/1.0">
  <start>
    <element name="college">
      <zeroOrMore>
        <element name="rollno">
          <element name="name">
            <text/>
          </element>
          <element name="subject">
            <text/>
          </element>
        </element>
      </zeroOrMore>
    </element>
  </start>
</grammar>

也许我错误地使用了该功能。也许我可以在进行检查之前将 rng 转换为 xsd?

PHP XML 验证 放松

评论

0赞 Martin Honnen 8/30/2023
您是否尝试过使用其他引擎进行 RNG 验证,以查看它们是否发现该样本的多个错误?如果遇到错误元素后,如果没有对该错误元素的声明,则很难进行验证。
0赞 Pick 8/30/2023
如果我尝试使用 Jing 或 Saxon 验证文件,则会检测到错误。但我想在PHP中做同样的事情。我也尝试了这个解决方案:libxml_use_internal_errors(true); $doc = new DOMDocument(); $doc->load($xmlFile); if (!$doc->relaxNGValidate($rngFile)) { $errors = libxml_get_errors(); foreach ($errors as $error) { echo "Error : " . $error->message . " (Line " . $error->line . ")\n"; } libxml_clear_errors(); }

答: 暂无答案