1

XPath エバリュエーターを介して、厳密に適切にフォーマットされていない XML を渡す必要があります。実際、XML はほとんどが html であり、次のようになります。

<p>
  <a href="http://www.something.com/5993810749/" title="IMG_3013”&gt;
    <img src="5993810749_107ea7d465_m.jpg" width="240" height="160" alt="IMG_3013”/>
  </a>
</p>
<p>
  <a href="http://www.something.com/836492365986/" title="IMG_3018”&gt;
    <img src=“8364923659_107ea3286465_m.jpg" width=“365" height=“248" alt="IMG_3018”/>
  </a>
</p>

したがって、顕著な問題は次のとおりです。ルート要素がありません。また<img>、終了していません。ルート要素でラップするのは簡単ですが、XPath エバリュエーターを通過すると、次のような例外が発生します。

[Fatal Error] :7:196: The element type "img" must be terminated by the matching end-tag "</img>".

ところで、Java の XPath エバリュエーターのコードは次のようになります。

XPath xPath = XPathFactory.newInstance().newXPath();
Object result = xPath.evaluate(xpath,
    new InputSource(new StringReader(xmlString)), XPathConstants.NODESET);

それで、XMLをうまく評価できるように、これに対処する最善の方法は何ですか? 少なくとも 2 つのオプションがあるようです。(a) XPath エバリュエーターをよりスマートにしようとする。または (b) 不適切な形式の XML を自動的に修復する方法を試してください。この問題の解決策をいただければ幸いです。

4

2 に答える 2

0

NekoHTMLなどのHTMLパーサーを使用してHTMLを解析し、結果のDOMツリーに対してXPathクエリを実行できます。

import org.cyberneko.html.parsers.DOMParser;
import org.w3c.dom.Document;
import org.w3c.dom.Node;

DOMParser parser = new DOMParser();
parser.parse(new InputSource(new StringReader(xmlString)));
XPath xPath = XPathFactory.newInstance().newXPath();
Object result = xPath.evaluate(xpath, parser.getDocument(),
      XPathConstants.NODESET);

NekoHTMLはデフォルトで特定のHTMLDOMノードを生成し、これらは元の入力タグの大文字と小文字に関係なく、ノード名を大文字で報告することに注意してください。したがって、すべての<p>要素を抽出するXPathが必要な場合//Pは、ではなく必要です//p

于 2013-01-21T14:23:55.127 に答える
0

HTML や一般的に山括弧を含むものを整形式の XML に変換するユーティリティがいくつかあります (期待した XML である場合とそうでない場合がありますが、整形式です)。JTidy と TagSoup は、この役割でよく使用されます。XML を実体化する必要はありません。XSLT 変換やスキーマ検証など、処理パイプラインの次のステップに直接送り込むことができます。

于 2013-01-21T15:24:49.713 に答える