Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何替换<;脚本>;用HTML解析器标记?_Java_Html Parsing_Html Parser - Fatal编程技术网

Java 如何替换<;脚本>;用HTML解析器标记?

Java 如何替换<;脚本>;用HTML解析器标记?,java,html-parsing,html-parser,Java,Html Parsing,Html Parser,我在JS中有以下功能: function replaceSrcc() { var elem = document.getElementsByTagName("embed")[0]; copy = elem.cloneNode(); copy.src = DataVideo; elem.parentNode.replaceChild(copy, elem); } 我试图使用Java中的HTML解析器将关键字DataVideo替换为另一个值videoID

我在JS中有以下功能:

function replaceSrcc() {

    var elem = document.getElementsByTagName("embed")[0];
        copy = elem.cloneNode();
    copy.src = DataVideo;
    elem.parentNode.replaceChild(copy, elem);
} 
我试图使用Java中的HTML解析器将关键字
DataVideo
替换为另一个值
videoID

if(tag instanceof ScriptTag){
      if("DataVideo".equals(tag.getAttribute("copy.src"))){
           tag.setAttribute("copy.src", videoID);
       }
};
然而,这是行不通的。我假设我在
标记中查找
copy.src
元素时出错,我认为它不是一个属性,但我不知道如何准确查找它


编辑:在HTML中负责parsin的整个类MyNodeVisitor如下所示:

public class MyNodeVisitor extends NodeVisitor {
        String name;
        String text;
        String storyText;
        String videoID;
        ArrayList<String> pictures;


        public MyNodeVisitor() {

        }

        public MyNodeVisitor(ArrayList<String> Pictures, String Name, String Text, String StoryText, String VideoId){
            this.name = Name;
            this.text = Text;
            this.storyText = StoryText;
            this.videoID = VideoId;
            this.pictures = Pictures;
        }

        public void visitStringNode (Text string)
        {
            if (string.getText().equals("DataName")) {
                string.setText(name);
            }

            else if (string.getText().equals("DataText")){
                  string.setText(text);
            }

            else if (string.getText().equals("DataStory")){
                  string.setText(storyText);
            }
        }

        @Override
        public void visitTag (Tag tag)
        {
            if(tag instanceof ImageTag){
                if("DataIcon".equals(tag.getAttribute("src"))){
                    tag.setAttribute("src", pictures.get(0));
                }
                else if("DataIcon2".equals(tag.getAttribute("src"))){
                    tag.setAttribute("src", pictures.get(1));
                }
                else if("DataIcon3".equals(tag.getAttribute("src"))){
                    tag.setAttribute("src", pictures.get(2));
                }
                else if("DataIcon4".equals(tag.getAttribute("src"))){
                    tag.setAttribute("src", pictures.get(3));
                }
                else if("DataIcon5".equals(tag.getAttribute("src"))){
                    tag.setAttribute("src", pictures.get(4));
                }
            }
            else if(tag instanceof ScriptTag){
                if(((ScriptTag) tag).getStringText().contains("DataVideo")){
                    String tagText = ((ScriptTag)tag).getStringText();
                    //String tagText = tagText.replaceAll("DataVideo",videoID);
                    }


                    /*NodeList nodes = ((ScriptTag)tag).getChildren();
                    for (int i = 0; i < nodes.size(); i++){
                        if (nodes.elementAt(i).getText().equals("DataVideo")){
                            nodes.elementAt(i).setText(videoID);*/
                        }

                    }
      }
公共类MyNodeVisitor扩展了NodeVisitor{
字符串名;
字符串文本;
字符串故事文本;
字符串videoID;
阵列列表图片;
公共MyNodeVisitor(){
}
公共MyNodeVisitor(ArrayList图片、字符串名称、字符串文本、字符串故事文本、字符串视频ID){
this.name=名称;
this.text=文本;
this.storyText=故事文本;
this.videoID=videoID;
这个。图片=图片;
}
公共无效visitStringNode(文本字符串)
{
if(string.getText().equals(“DataName”)){
string.setText(名称);
}
else if(string.getText().equals(“DataText”)){
string.setText(文本);
}
else if(string.getText().equals(“数据存储”)){
setText(故事文本);
}
}
@凌驾
公共无效访问标签(标签标签)
{
如果(标记ImageTag的实例){
if(“DataIcon”.equals(tag.getAttribute(“src”)){
setAttribute(“src”,pictures.get(0));
}
else if(“DataIcon2”.equals(tag.getAttribute(“src”)){
setAttribute(“src”,pictures.get(1));
}
else if(“DataIcon3”.equals(tag.getAttribute(“src”)){
setAttribute(“src”,pictures.get(2));
}
else if(“DataIcon4”.equals(tag.getAttribute(“src”)){
setAttribute(“src”,pictures.get(3));
}
else if(“DataIcon5”.equals(tag.getAttribute(“src”)){
setAttribute(“src”,pictures.get(4));
}
}
else if(ScriptTag的标记实例){
if(((ScriptTag)标记).getStringText()包含(“数据视频”)){
字符串tagText=((ScriptTag)标记).getStringText();
//字符串tagText=tagText.replaceAll(“DataVideo”,videoID);
}
/*NodeList节点=((ScriptTag)标记).getChildren();
对于(int i=0;i
} 编辑: 以下是预先准备好的HTML模板:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>

 ....

</head>
<body>

<script>
function replaceSrcc() {

    var elem = document.getElementsByTagName("embed")[0];
        copy = elem.cloneNode();
    copy.src = DataVideo;
    elem.parentNode.replaceChild(copy, elem);
    } 


    if (window.addEventListener){
         window.addEventListener('load', replaceSrcc, false);
    } else if (window.attachEvent) {
        window.attachEvent('onload', replaceSrcc);
    }

</script>

<h1 align="center">DataName</h1>

<div class="tabber">



     <div class="tabbertab" bgcolor="blue">
      <h2 color="red">Info </h2>
      <p>DataText</p>
     </div>

     <div class="tabbertab">
      <h2>Story from TIME</h2>
      <p>DataStory</p>
     </div> 

     <div class="tabbertab">
      <h2>Pictures</h2>
        <div id="album">
            <ul class="gallery">
                <li><a href="#nogo" tabindex="1">1<img src=DataIcon alt="landscape image 1" title="landscape image 1" /></a></li>
                <li><a href="#nogo" tabindex="1">2<img src=DataIcon2 alt="landscape image 2" title="landscape image 2" /></a></li>
                <li><a href="#nogo" tabindex="1">3<img src=DataIcon3 alt="portrait image 1" title="portrait image 1" /></a></li>
                <li><a href="#nogo" tabindex="1">4<img src=DataIcon4 alt="portrait image 2" title="portrait image 2" /></a></li>
                <li><a href="#nogo" tabindex="1">5<img src=DataIcon5 alt="landscape image 3" title="landscape image 3" /></a></li>
            </li>
            </ul>
        </div>   
     </div>

     <div class="tabbertab">
      <h2>Video</h2>

        <object width="640" height="360">
        <param name="movie" value="https://www.youtube.com/v/M7lc1UVf-VE?version=3"></param>
        <param name="allowFullScreen" value="true"></param>
        <param name="allowScriptAccess" value="always"></param>
        <embed src=DataVideo type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="360"></embed>
    </object>
           </div>
    </div>

</body>
</html>

....
函数replacesrc(){
var elem=document.getElementsByTagName(“嵌入”)[0];
copy=elem.cloneNode();
copy.src=DataVideo;
elem.parentNode.replaceChild(复制,elem);
} 
if(window.addEventListener){
addEventListener('load',replaceSRC,false);
}else if(窗口附件){
window.attachEvent('onload',replacesrc);
}
数据名
信息
数据文本

时事 数据存储

图片
视频
我想您使用的是
org.htmlparser.*
库。如果您发布更多的java代码,这会很有帮助。但是,您似乎想要解析JavaScript动态生成的HTML。好吧,htmlparser无法做到这一点。您将需要某种类型的屏幕抓取库,以便能够在HTML文档中呈现JavaScript。耶s、 我正在使用org.htmlparser库。我正在尝试解析HTML,并用表示youtube链接的字符串videoID替换JavaScript函数中的关键字“DataVideo”。完成后,函数replaceSRC()将用一个新设置的src属性重新创建嵌入对象。所以你认为这行不通吗?我将把整个HTMLPasser类放在问题的编辑中。请也提供你的HTML。HTML从何而来?我也不太明白你打算如何用HTMLPasser注入JS函数,以及为什么要将两者结合使用。请详细说明您的场景!重点是我正在将数据库中的数据访问到我的Java应用程序中,然后我必须将检索到的值提交到HTML并基于这些值创建它。要将这些值解析为HTML,我使用的是HTMLPasser。它工作得非常好,除了一个值,如下所述。问题是我不知道如何用html解析器替换OBJECT元素中的值,所以我创建了JS函数来实现这一点,现在我想将该值传递给JS函数,然后这个函数将在加载时替换该值。有点奇怪,但这是唯一的解决方案。所以你从DB中检索实际的html,解析它,注入JS,然后呢?