0

COBRA HTMLParserを使用していますが、特定の1つのタグを解析できませんでした。ソースは次のとおりです。

<li id="eta" class="hentry">
  <span class="body">
    <span class="actions">
    </span>
    <span class="content">
    </span>
    <span class="meta entry">Content here
    </span>
    <span class="meta entry stub">Content here
    <span class="shared-content">
      Information by
      <a class="title" data="associate" href="/associate">Associate</a>
    </span>
    </span>
  </span>
</li>

次のXPathを使用して、適切な情報を取得できます。

            XPath xpath = XPathFactory.newInstance().newXPath();
            NodeList nodeList = (NodeList) xpath.evaluate("//span[contains(@class, 'body')]", document, XPathConstants.NODESET);
            int length = nodeList.getLength();
            System.out.println(nodeList.getLength());
            for(int i = 0; i < length; i++) {
                Element element = (Element) nodeList.item(i);
                NodeList n = null;
                try {
                    n = (NodeList) xpath.evaluate("span[contains(@class, 'content')]", element, XPathConstants.NODESET);
                    String body = n.item(0).getTextContent();
                    System.out.println("Content: " + body);
                } catch (Exception e) {};

                try {

                    String date = (String) xpath.evaluate("span[contains(@class, 'meta entry')]/a/span/@data", element, XPathConstants.STRING);
                    System.out.println("DATA: " + date);

                    String source = (String) xpath.evaluate("//span[contains(@class, 'meta entry')]/span", element, XPathConstants.STRING);
                    System.out.println("DATA: " + source);

                } catch (Exception e) {};

                //This does not work at all! I've tried every combination and still can't get it to run
                try {
                    String info = (String) xpath.evaluate("//span[@class='shared-content']/a/@data", element, XPathConstants.STRING);
                    System.out.println("INFO: " + info);
                } catch (Exception e) {};

            }

最後の式は、私が試したどの組み合わせでも機能しません。私も次のことを試しましたが、役に立ちません、

        String info = (String) xpath.evaluate("//span[contains(@class, 'shared-content')]/a/@data", element, XPathConstants.STRING);
        String info = (String) xpath.evaluate("//span[contains(@class, 'meta entry info')]/span/a/@data", element, XPathConstants.STRING);

助言がありますか?

編集:XMLが違法であるという提案がいくつかありますが(正直なところ、これまでほとんどどこでも見たので、なぜ違法なのかはわかりません)、XMLを制御することはできません。 (少なくとも月曜日まで、他の仲間が戻ってくるまで)。この情報を含むマッシュアップを作成する可能性を確認しようとしています。チェックなどを無効にする方法はありますか?

解析されたXMLは次のとおりです。

       <?xml version="1.0" encoding="UTF-8"?>
          <span class="body">
            <span class="content">TextContent</span>
            <span class="meta entry">TextContent</span>

          </span>

ドキュメントが正しく解析されていないと思います。

4

4 に答える 4

2

XPathVisualizerは優れた XPath ビジュアライザー ツールであり、Windows 上で実行され、XPath クエリの結果を確認できます。Xcopy インストール、単一の EXE ファイル。無料。

私はそれを取り、その中でクエリを実行しましたが、次の結果が得られました:

代替テキスト

于 2009-11-26T23:03:15.477 に答える
1

@Jherico、@Andrew Keith COBRA HTMLParser はわかりませんが、#PCDATA と内部ノードを組み合わせることは、合法的な XML 形式です。
これは、DTD で次のように定義できます。

<!ELEMENT text_node     (#PCDATA|i|b|u)*>

これは、適切にフォーマットされた HTML が依然として正当な XML である方法です。

于 2009-11-26T22:37:37.560 に答える
0

コード サンプルをそのまま (コピー ペースト) 実行したところ、この出力が得られました。だから、すべてがうまくいくようです。(使用しているコブラのバージョンは? Me 0.98.4)

1
Content:

DATA:
DATA:
      Information by
      Associate

INFO: associate

再現可能なテスト(?)

  • javac/java バージョン 1.6.0_16 の使用 (HotSpot クライアント: ビルド 14.2-b01、混合モード、共有)
  • ここから0.98.4 ( cobra-0.98.4.zip)をダウンロードしましたSourceforge: Cobra HTML Toolkit download
  • 抽出さjs.jarれ、ディレクトリcobra.jarからcobra-0.98.4.zip:\libXXX
  • 書き込みXMLTest.javaHTMLTest.java同じディレクトリ ( !filenames はソースへのリンクです)
  • これを実行してコンパイルします(Windows):javac -cp .;cobra.jar;js.jar *.java
  • 次に、このように実行されます(出力が含まれています)

XML テスト

java -cp .;cobra.jar;js.jar XMLTest 1

XMLTest 出力:

1
Content:

DATA:
DATA:
      Information by
      Associate

INFO: associate 

HTMLテスト

java -cp .;cobra.jar;js.jar HTMLTest 1

HTMLTest 出力:

1
Content:

DATA:
DATA:
      Information by
      Associate

INFO: associate
于 2009-11-27T01:24:25.287 に答える
0

次のコードを実行しました

public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException, XPathExpressionException {
    Document doc = XmlUtil.parseXmlResource("/temp.xml");
    for (Node n : XPathUtil.getNodes(doc, "//span[contains(@class, 'body')]")) {
        System.out.println(XPathUtil.getStringValue(doc, "//span[@class='shared-content']/a/@data"));
    }
}

そして、「associate」を出力します。あなたのXPathは問題ないと思います。代わりに何が起こっていますか?また、空の catch ブロックを削除して、実際に例外が発生しているかどうかを確認できますか?

XmlUtil と XPathUtil は、XPath と XML のボイラープレート コードのほとんどを排除するための私自身の便利な関数です。

于 2009-11-26T22:53:12.650 に答える