6

非常に重い XML ファイル (200 MB から 1 GB の間) を読み取る必要があり、それらの一部は無効です。ちょっとした例を挙げましょう:

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:g="http://base.google.com/ns/1.0" version="2.0">
  <item>
    <title>Some article</title>
    <g:material><ul><li>50 % Coton</li><li>50% Lyocell</li></g:material>
  </item>
</rss>

明らかに、</ul>タグに終了タグがありませんg:material。さらに、このフィードを作成した人は、g:materialコンテンツを に含める必要がありましCDATAたが、そうではありませんでした... 基本的に、それが私がやりたいことです: この欠落しているCDATAセクションを追加します。

SAX パーサーを使用してこのファイルを読み取ろうとしましたが</g:material>、タグがないため、タグの読み取りに失敗しました</ul>。XMLReader を試してみましたが、基本的に同じ問題が発生しました。おそらく DomDocument::loadHtml で何かを行うことができますが、このファイルのサイズは実際には DOM アプローチと互換性がありません。DomDocument が機能するために大量の RAM を購入することなく、このフィードを簡単に修復する方法をご存知ですか? ありがとう。

4

2 に答える 2

3

ファイルが大きすぎてTidy拡張機能を使用できない場合は、tidy CLI ツールを使用してファイルを解析可能にすることができます。

$ tidy -output my.clean.xml my.xml

その後、XML ファイルは整形式であるため、XMLReader を使用して解析できます。tidy は「不足している」(X)HTML パーツを追加するため、元のドキュメントのコードは要素内にあります。

于 2013-03-28T14:47:10.453 に答える
0

( https://stackoverflow.com/a/17903058/287948からコピー)

2 つのステップとして要約すると、次のようになります。

  1. Tidyを使用して、「無料の HTML」を「優れた XHTML」に変換します。
  2. XML Parserを使用して、 SAX APIによって XHTML を XML として解析します。

最初のTidy (!) を使用して、「フリー HTML」を XHTML に変換します (または、「想定される XHTML」を信頼できない場合)。cleanRepairメソッドを参照してください。時間がかかりますが、大きなファイルで実行されます (!)...大きすぎる場合 は、最大実行時間を数分に設定してください。

もう 1 つのオプション (大きなファイルを扱う場合) は、XHTML ファイルをチェックまたは XHTML に変換した後にキャッシュすることです。Tidy のrepairfileメソッドを参照してください。

「信頼できる XHTML」では、SAXを使用します... PHP で SAX を使用するには?

PHP ではLibXML ( xmlsoft.orgのLibXML2を参照)によって実装されているSAX 標準 APIを使用して XML を解析します。そのインターフェイスは、 SAX 標準 APIに近いPHP の XML パーサーです。

「 LibXML2の SAX 」を別のインターフェース (従来の SAX インターフェースの代わりにPHP イテレーター) で使用する別の方法は、 XMLReaderを使用することです。「XMLReader use SAX」についてはこちらの説明をご覧ください。


はい、「SAX」または「SAX API」という用語は、PHP のマニュアルには記載されていません (!)。この古いが良い紹介を参照 してください。

于 2013-07-27T22:36:04.823 に答える