Как проверить каждый тег xml на xsd и записать теги, которые проходят проверку, в новый файл XML - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть два файла, один из которых - xml, а другой - xsd, теперь я хочу проверить xml-файл по схеме xsd, пройдя каждый тег и, в конце концов, переписав теги, которые проходят проверку, в новый xml-файл.

<?php

    function libxml_display_error($error)
    {
    $return = "<br/>\n";
    switch ($error->level) {
        case LIBXML_ERR_WARNING:
            $return .= "<b>Warning $error->code</b>: ";
            break;
        case LIBXML_ERR_ERROR:
            $return .= "<b>Error $error->code</b>: ";
            break;
        case LIBXML_ERR_FATAL:
            $return .= "<b>Fatal Error $error->code</b>: ";
            break;
    }
    $return .= trim($error->message);
    if ($error->file) {
        $return .=    " in <b>$error->file</b>";
    }
    $return .= " on line <b>$error->line</b>\n";

    return $return;
}

function libxml_display_errors() {
    $errors = libxml_get_errors();
    foreach ($errors as $error) {
        print libxml_display_error($error);
    }
    libxml_clear_errors();
}

// Enable user error handling
libxml_use_internal_errors(true);

$xml = new DOMDocument();
$xml->load('example.xml');

if (!$xml->schemaValidate('example.xsd')) {
    print '<b>DOMDocument::schemaValidate() Generated Errors!</b>';
    libxml_display_errors();
}else{
     var_dump($xml);
}

Вышеприведенный код выводится только в том случае, если весь XML-файл действителен, существует ли способ проверки элементов, например, если некоторые элементы проходят проверку на достоверность, то мы перезаписываем действительные элементы в другой XML-файл?

1 Ответ

0 голосов
/ 14 ноября 2018

Предполагая, что под "тегами" вы подразумеваете "элементы", вы можете сделать это в XSLT 3.0, используя следующую логику:

<xsl:template match="*">
  <xsl:apply-templates/>
  <xsl:try>
    <xsl:copy-of select="." validation="lax">
    <xsl:catch errors="*"/>
  </xsl:try>
</xsl:template>

Это скопирует все поддерево элемента, который проходит проверку.на выход;возможно, вы только хотели вывести имя элемента.Если это так, вы можете сделать:

<xsl:template match="*">
  <xsl:apply-templates/>    
  <xsl:try>   
    <xsl:variable name="copy" as="element(*)">      
      <xsl:copy-of select="." validation="lax">
    </xsl:variable>
    <xsl:value-of select="name($copy)"/>
    <xsl:catch errors="*"/>
  </xsl:try>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...