【问题标题】:Get a substring from an XML file从 XML 文件中获取子字符串
【发布时间】:2016-05-22 08:36:51
【问题描述】:

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

直到现在我可以查看所有HTML代码,然后我需要将所有HTML代码转换为String,最后从转换后的字符串中得到一个“子字符串”,应该是每个图像的图像URL。

我注释掉了代码中不能正常工作的部分。如果您尝试收到此错误:

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

我不明白为什么会出现此错误。我究竟做错了什么?我尝试了几件事作为“子字符串”中的参数,但任何人都可以正常工作,我们现在的参数是尝试获取标签(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);
    }
}

【问题讨论】:

  • 您已经在使用 Transformer。为什么不给那个 Transformer 一个 XSL 文件,去除除//img/@src 之外的所有内容?
  • 我不知道该怎么做。从那个“变压器”中获取子字符串真的很难吗?

标签: java html xml string javafx


【解决方案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);
    }
}

【讨论】:

  • 你的解决方案它有效,但是(这是我的错我之前没有说)我需要在不点击webview的情况下获取路径,因为用户不会看到webview,只需插入一个或更多词在谷歌搜索。
  • 我不明白评论。该代码会在页面加载到 Web 视图后立即获取图像 URL(无需任何用户交互)。我更新了完整的可执行示例。您是说要在不显示页面的情况下获取它们吗?
  • 谢谢,这是我的错。所以,这样我就不需要“transformer”了,我也看到transformer的代码和网页不一样(或者更好的webengine),为什么?
  • 再说一次,不太清楚你的意思。您是否将原始代码的输出与在浏览器中打开页面并执行“查看源代码”进行比较?还是我误会了?
  • 是的,你是对的。我尝试比较原始代码的输出和网页(使用 FIrefox 使用分析元素)的输出,我发现很多东西也不同,路径。
【解决方案2】:

IndexOf() 将返回您的第一次出现。您尝试获取由“”组成的子字符串。

在你的情况下调用

output.indexOf("/&gt;");

您的“/>”是html文档中的第一个,可能是您的“head-Tag”或其他东西。这也可以解释负面的 StringOutOfBoundsException。

您必须从“IMG”的索引开始解析,直到第一次出现“/>”。这将是您的 img-tag 的最后一个。

【讨论】:

    猜你喜欢
    • 2015-08-06
    • 2011-11-05
    • 2019-06-06
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多