1

次のコードは XML ファイルを作成しますが、最後の行が空白であるため、検証時に問題が発生します。

出力ファイルの末尾に空白行がないように、次のコードを変更するにはどうすればよいですか?

<?php
$xmlFileName = 'testoutput.xml';

$xml = new XMLWriter;
$xml->openURI($xmlFileName);
$xml->startDocument('1.0', 'UTF-8');
$xml->setIndent(1);

$xml->startElement('name');
$xml->text('jim');
$xml->endElement();

$xml->endDocument();
$xml->flush();      
?>

@DavidRR、次のコードでXMLファイルを検証すると、検証の問題が発生します。「ドキュメントの最後に余分なコンテンツがある」ことがわかります。

$schema = 'test.xsd';
$files[] = 'test1.xml';
$files[] = 'test2.xml';

foreach ($files as $file) {
    validateXml($file, $schema);
}

function validateXml($xmlFile, $xsdFile) {
    $dom = new DOMDocument;
    $dom->load($xmlFile);
    libxml_use_internal_errors(true); // enable user error handling
    echo "Validating <b>$xmlFile</b> with <b>$xsdFile</b>:";
    if ($dom->schemaValidate($xsdFile)) {
        echo '<div style="margin-left:20px">ok</div>';
    } else {
        $errors = libxml_get_errors();
        if (count($errors) > 0) {
            echo '<ul style="color:red">';
            foreach ($errors as $error) {
                //var_dump($error);
                echo '<li>' . $error->message . '</li>';
            }
            echo '</ul>';
        }
        libxml_clear_errors();
        echo '</span>';
        libxml_use_internal_errors(false); // enable user error handling
    }
}   
4

3 に答える 3

1

その点での動作を変更する方法は見つかりませんでしXmlWriterた。可能な修正は、ファイルを読み取ってから、ファイルにtrim書き戻すことです。

file_put_contents($xmlFileName, trim(file_get_contents($xmlFileName)));

デモ

代替はftruncate、ファイルへの

ftruncate(fopen($xmlFileName, 'r+'), filesize($xmlFileName) - strlen(PHP_EOL));

デモ

後者は、ファイルにプラットフォーム依存の改行があることを前提としています。存在しない場合、ファイルが破損する可能性があります。このtrimバージョンは、改行がない場合でもファイルを損傷しないため、その点でより堅牢ですが、コンテンツをトリミングするためにファイル全体をメモリに読み込む必要があります。

于 2012-09-04T15:39:56.927 に答える
1

Linux/Unix システムを使用している場合は、次のことができます。

$test = `head -n -1 < $xmlFileName > $xmlFileName`;

これを参照してください。

于 2012-09-04T16:05:01.960 に答える
1

報告された問題: XML ファイルの最後に空白行があるため、ファイルに対してスキーマ検証を試みると、次のエラーが発生します。

"Extra content at the end of the document"

codepad、PHP バージョン5.4-dev、またはそのサイトの以前のバージョンの PHP で、あなたが述べた問題を再現できません。編集したバージョンのコードもここに含めます。(私のバージョンには、調査中の単純な XSD および XML ファイルを作成する機能が含まれています。)

可能性:問題は、使用している PHP のバージョンに関連している可能性がありますか?

あなたのコードを適応させてシナリオを正確にテストしていない場合は、コードをさらに変更して問題を引き起こします。

<?php

$xsdFile = sys_get_temp_dir() . '/test1.xsd';
$xmlFile = sys_get_temp_dir() . '/test1.xml';

createXsdFile($xsdFile);
createXmlFile($xmlFile);

$files[] = $xmlFile;

foreach ($files as $file) {
    validateXml($file, $xsdFile);
}

function validateXml($xmlFile, $xsdFile) {
    $dom = new DOMDocument;
    $dom->load($xmlFile);

    libxml_use_internal_errors(true); // enable user error handling
    echo "Validating <b>$xmlFile</b> with <b>$xsdFile</b>:";
    if ($dom->schemaValidate($xsdFile)) {
        echo '<div style="margin-left:20px">ok</div>';
    } else {
        $errors = libxml_get_errors();
        if (count($errors) > 0) {
            echo '<ul style="color:red">';
            foreach ($errors as $error) {
                //var_dump($error);
                echo '<li>' . $error->message . '</li>';
            }
            echo '</ul>';
        }
        libxml_clear_errors();
        echo '</span>';
        libxml_use_internal_errors(false); // enable user error handling
    }
}

function createXsdFile($xsdFile) {
    $file = fopen($xsdFile, 'w');
    fwrite($file, "<?xml version='1.0' encoding='utf-8'?>\n");
    fwrite($file, "<schema xmlns='http://www.w3.org/2001/XMLSchema'>\n");
    fwrite($file, "<element name='name' type='string' />\n");
    fwrite($file, "</schema>\n");
    fclose($file);
}

//
// Appends a blank line at the end of the XML file.
// Does this cause a schema validation problem?
//
function createXmlFile($xmlFile) {
    $xml = new XMLWriter;
    $xml->openURI($xmlFile);
    $xml->startDocument('1.0', 'UTF-8');
    $xml->setIndent(1);

    $xml->startElement('name');
    $xml->text('jim');
    $xml->endElement();

    $xml->endDocument();
    $xml->flush();
}
?>
于 2012-09-06T12:27:38.480 に答える