1

私は主なデータが xsl 変換から来る XML 生成を行っています (しかし、それは問題ではなく、PHP DOM または SimpleXML を使用していない理由です)。

このような:

$xml =  '<?xml version="1.0" encoding="utf-8"?>' . PHP_EOL;
$xml .= '<rootElement>';

foreach($xslRenderings as $rendering) {
    $xml .= $rendering;
}

$xml .= '</rootElement>';

結果の XML は、 http://www.freeformatter.com/xml-validator-xsd.htmlhttp://xsdvalidation.utilities-online.info/の XSD に対して検証されます。

しかし、ここで失敗します: http://www.xmlforasp.net/schemavalidator.aspx

Unexpected XML declaration. The XML declaration must be the first node in the 
document, and no white space characters are allowed to appear before it. 
Line 2, position 3.

PHP_EOL によって生成された改行を手動で削除してリターンを押すと、検証されます。

最後のスキーマバリデーターのエラーだと思います。それとも、PHP_EOL (または PHP の手動ブレーク) は、一部のバリデータにとって問題なのでしょうか? はいの場合、それを修正する方法は?

結果の XML が .NET サービスに送信され、最後のバリデーターが NET で構築されているため、私は尋ねています。

編集

XML は次のようになります。スキームはここにありますhttp://cb.heimat.de/interface/schema/interfaceformat.xsd

<?xml version="1.0" encoding="utf-8"?>
<dataset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://cb.heimat.de/interface/schema/interfaceformat.xsd">
<production foreignId="1327" id="0" cityId="6062" productionType="3" subCategoryId="7013" keywords="" productionStart="" productionEnd="" url=""><title languageId="1">
...
</production>
4

1 に答える 1

1

何が起こっているのかを理解するには、生成された XML をバイナリ ストリームとして見る必要があります。何を見ればいいのか説明しようと思います...

説明に役立つように、無効な XML (あなたのものと同様) のダンプを示します。

ここに画像の説明を入力

最初の 3 バイトはバイト オーダー マークで、テキスト ファイルとストリーム (この場合は UTF-8) で検出される可能性があります。これらの種類のバイトは、エンコード方式を理解するためのヒントとして使用されるため、対応する XML パーサーがトリップすることはありません。

次の 2 バイト (0x0D0A) は、Windows プラットフォームの改行です。これらは、XML パーサーが整形式のルールに失敗する原因となるはずです。現在の XML 1.0 標準によると、XML 宣言の前に空白を使用することはできません。

.NET では、説明したようなエラーが発生します。Java (xerces ベース) は、より不可解なことを言うでしょう:The processing instruction target matching "[xX][mM][lL]" is not allowed. [2]

最初の前の空白を削除する<と、このエラー メッセージが修正されます。あなたがしなければならないことは、その空白がどのようにそこに到達するかを理解することです...

あなたが説明したことから、XML PI が XML を使用する前に何らかの形で削除されたように見えます。

于 2012-08-14T17:49:17.963 に答える