xml_get_current_column_number()関数は、現在のxmlパーサーによって指された列番号を返します。 XMLファイルを解析すると、パーサーは行ごとにファイルのコンテンツを読み取ります。 xml_get_current_column_number()は、解析プロセス中に開発者が現在の列の場所を知るのに役立ちます。これは、XML解析プロセスのデバッグにとって特に重要です。
この関数の構文は次のとおりです。
<span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">xml_get_current_column_number</span></span><span> ( resource </span><span><span class="hljs-variable">$parser</span></span><span> )
</span></span>
$パーサー: XML_PARSER_CREATE()を介して作成されたXMLパーサーのリソースハンドル。
関数は、現在の列の位置を示す整数を返します。
xml_get_current_column_number()は、有効なXMLパーサーリソースに依存しています。関数が呼び出されたときにパーサーが適切に作成または初期化されていない場合、関数は正しい列番号を返すことができません。
回避策: xml_get_current_column_number()を呼び出す前にxmlパーサーが正常に作成されたこと、およびパーサーがxmlデータの解析を開始したことを確認してください。
<span><span><span class="hljs-variable">$parser</span></span><span> = </span><span><span class="hljs-title function_ invoke__">xml_parser_create</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">xml_parse</span></span><span>(</span><span><span class="hljs-variable">$parser</span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">xml_get_current_column_number</span></span><span>(</span><span><span class="hljs-variable">$parser</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">xml_parser_free</span></span><span>(</span><span><span class="hljs-variable">$parser</span></span><span>);
</span></span>
XMLの解析を実行すると、XMLデータが誤ってフォーマットされた場合、 XML_GET_CURRENT_COLUMN_NUMBER()が誤った結果を返す場合があります。これは通常、解析プロセス中にエラーが発生し、列番号が正しく更新されないためです。
回避策: xml_get_current_column_number()を使用する前に、すべてのxmlデータが適切な検証に合格し、解析中にエラーが発生しなかったことを確認してください。 xml_get_error_code()を使用して、エラーコードを確認できます。
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">xml_get_error_code</span></span><span>(</span><span><span class="hljs-variable">$parser</span></span><span>) != XML_ERROR_NONE) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"XML Error: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">xml_error_string</span></span><span>(</span><span><span class="hljs-title function_ invoke__">xml_get_error_code</span></span><span>(</span><span><span class="hljs-variable">$parser</span></span><span>));
}
</span></span>
XMLファイルまたはデータが正しく読み取られていない場合、またはファイルの一部を解析できない場合、 XML_GET_CURRENT_COLUMN_NUMBER()によって返される値も不正確になる場合があります。特に大きなファイルを処理する場合、ファイルがチャンクで正しく読み取られていない場合、列番号の逸脱につながる可能性があります。
解決策:大きなファイルを解析するときは、 XML_PARSE()のチャンク読み取りモードを使用し、毎回解析されたコンテンツがXMLの構造要件を満たす必要があることを確認してください。
<span><span><span class="hljs-variable">$parser</span></span><span> = </span><span><span class="hljs-title function_ invoke__">xml_parser_create</span></span><span>();
</span><span><span class="hljs-variable">$fp</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'file.xml'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>)) {
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">xml_parse</span></span><span>(</span><span><span class="hljs-variable">$parser</span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>, </span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>))) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Error: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">xml_error_string</span></span><span>(</span><span><span class="hljs-title function_ invoke__">xml_get_error_code</span></span><span>(</span><span><span class="hljs-variable">$parser</span></span><span>));
}
}
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">xml_parser_free</span></span><span>(</span><span><span class="hljs-variable">$parser</span></span><span>);
</span></span>
特殊文字がXMLファイル(目に見えない文字、コントロール文字など)に含まれている場合、または解析中にデータ形式が変更された場合、列数の計算エラーにつながる可能性もあります。
解決策:XMLデータを処理するときは、データの特殊文字をクリーンアップし、XMLファイルのエンコード形式が一貫していることを確認してください。
<span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/[\x00-\x1F\x7F]/'</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>); </span><span><span class="hljs-comment">// 目に見えない文字をクリアします</span></span><span>
</span><span><span class="hljs-variable">$parser</span></span><span> = </span><span><span class="hljs-title function_ invoke__">xml_parser_create</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">xml_parse</span></span><span>(</span><span><span class="hljs-variable">$parser</span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>);
</span></span>
場合によっては、 XML_GET_CURRENT_COLUMN_NUMBER()が呼び出される場合があります。XMLパーサーが解析を開始していないか、解析を完了し、この時点で返された列番号は自然に不正確です。
解決策: xml_get_current_column_number()を呼び出すタイミングは非常に重要です。解析中は、解析中ではなく、解析中に呼び出されなければなりません。
<span><span><span class="hljs-variable">$parser</span></span><span> = </span><span><span class="hljs-title function_ invoke__">xml_parser_create</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">xml_parse</span></span><span>(</span><span><span class="hljs-variable">$parser</span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>); </span><span><span class="hljs-comment">// 正しい通話タイミング</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">xml_get_current_column_number</span></span><span>(</span><span><span class="hljs-variable">$parser</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">xml_parser_free</span></span><span>(</span><span><span class="hljs-variable">$parser</span></span><span>);
</span></span>