从XML文件中获取子字符串

时间:2016-02-11 14:07:24

标签: java html xml string javafx

我试图在Google图片研究后获取每个src="path"标记内的每个图片<img>

到现在为止,我可以查看所有HTML代码,然后我需要转换String中的所有HTML代码,最后得到一个&#34; substring&#34;从转换后的字符串中,应该是每个图像的图像URL。

我评论了代码中运行不正常的部分。如果您尝试,则会收到此错误:

  

java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-75875`

我不明白为什么会收到此错误。我究竟做错了什么?我在&#34; substring&#34;中尝试了几个参数作为参数。但是任何人都工作正常,我们现在的参数是尝试获取标签的全部内容(IMG)。

那么,我如何获取所有路径,然后保存它?

提前致谢

import java.io.OutputStreamWriter;
import java.io.StringWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList;
import javafx.concurrent.Worker;
import javafx.concurrent.Worker.State;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;


public class Main extends Application {
    @Override

    public void start(Stage primaryStage) {
        HBox hbox = new HBox();
        WebView webview = new WebView();
        final WebEngine webengine = webview.getEngine();
        webengine.getLoadWorker().stateProperty().addListener(
                new ChangeListener<State>() {
                    public void changed(ObservableValue ov, State oldState, State newState) {
                        if (newState == Worker.State.SUCCEEDED) {
                            Document doc = webengine.getDocument();
                            try {
                                Transformer transformer = TransformerFactory.newInstance().newTransformer();
                                transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
                                transformer.setOutputProperty(OutputKeys.METHOD, "xml");
                                transformer.setOutputProperty(OutputKeys.INDENT, "yes");
                                transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
                                transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");

                                transformer.transform(new DOMSource(doc),
                                        new StreamResult(new OutputStreamWriter(System.out, "UTF-8")));
//                              StringWriter writer = new StringWriter();
//                              transformer.transform(new DOMSource(doc),
//                                      new StreamResult((writer)));
//                              String output = writer.getBuffer().toString().replaceAll("\n|\r", "");
//                         System.out.println("Outputvale"+output);
//                         String immagine =output.substring(output.indexOf("<IMG")+1,output.indexOf("/>"));
//                         System.out.println(immagine);
                            } catch (Exception ex) {
                                ex.printStackTrace();
                            }
                        }
                    }
                });
        webengine.load("https://www.google.it/search?q=casa&biw=1440&bih=765&source=lnms&tbm=isch&sa=X&ved=0ahUKEwiI0MvF0O3KAhUCGA8KHZixCzIQ_AUIBygC");
        primaryStage.setScene(new Scene(webview, 800, 800));
        primaryStage.show();
    }





    public static void main(String[] args) {
        launch(args);
    }
}

2 个答案:

答案 0 :(得分:1)

不要自己解析HTML,只需使用DOM API即可。另请注意,直接监听Web引擎的documentProperty()可能更安全,而不是假设在加载工作完成时文档完全可用。

import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;


public class Main extends Application {
    @Override

    public void start(Stage primaryStage) {
        WebView webview = new WebView();
        final WebEngine webengine = webview.getEngine();

        webengine.documentProperty().addListener((obs, oldDoc,  newDoc) -> {
            if (newDoc != null) {
                NodeList nodeList = newDoc.getElementsByTagName("img");
                for (int i = 0; i < nodeList.getLength(); i++) {
                    Element img = (Element)nodeList.item(i);
                    String src = img.getAttribute("src");
                    System.out.println(src);
                }
            }
        });
        webengine.load("https://www.google.it/search?q=casa&biw=1440&bih=765&source=lnms&tbm=isch&sa=X&ved=0ahUKEwiI0MvF0O3KAhUCGA8KHZixCzIQ_AUIBygC");
        primaryStage.setScene(new Scene(webview, 800, 800));
        primaryStage.show();
    }





    public static void main(String[] args) {
        launch(args);
    }
}

答案 1 :(得分:-1)

IndexOf()将返回您的第一次出现。您尝试获取由&#34;&#34;。

组成的子字符串

在您的情况下致电

output.indexOf("/>");

你的&#34; /&gt;&#34;是html文档中的第一个,也许是你的&#34; head-Tag&#34;或者是其他东西。这也可以解释负面的StringOutOfBoundsException。

你必须从&#34; IMG&#34;的索引中解析。直到&#34; /&gt;&#34;的第一次出现。这将是你的img-tag的结束。