Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/71.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_Xml_Parsing_Xpath - Fatal编程技术网

是否存在生成的节点保留原始文本索引的Java HTML解析器?

是否存在生成的节点保留原始文本索引的Java HTML解析器?,java,html,xml,parsing,xpath,Java,Html,Xml,Parsing,Xpath,我希望以XML形式查询HTML文档(例如使用XPath),因此我需要通过某种形式的HTML清理器传递HTML 但我还想根据查询结果修改原始源字符串 是否有一个Java HTML解析器保留原始源字符串的索引,这样我就可以找到一个节点并修改原始字符串的正确部分 干杯。我不知道“保留原始文本的索引”部分,但它是一个非常好的HTML解析器库 以下是如何从html中删除每个跨距的示例: publicstaticstringremovespans(字符串html){ 源代码=新源代码(html); sour

我希望以XML形式查询HTML文档(例如使用XPath),因此我需要通过某种形式的HTML清理器传递HTML

但我还想根据查询结果修改原始源字符串

是否有一个Java HTML解析器保留原始源字符串的索引,这样我就可以找到一个节点并修改原始字符串的正确部分

干杯。

我不知道“保留原始文本的索引”部分,但它是一个非常好的HTML解析器库

以下是如何从html中删除每个跨距的示例:

publicstaticstringremovespans(字符串html){
源代码=新源代码(html);
source.fullSequentialParse();
OutputDocument OutputDocument=新的OutputDocument(源);
List tags=source.getAllTags();
用于(标记:标记){
字符串标记名=tag.getName().toLowerCase();
if(标记名.equals(“span”)){
//移除
outputDocument.remove(标签);
}
}
返回outputDocument.toString();
}
我想你可以用


您可以使用类和从类获取原始的索引。

正如其他人所建议的,您可能希望呈现DOM。这基本上只意味着构建节点树,它不会改变文档源,除非您使用类似HTML的清理程序。这样您就可以轻松访问该文档,并可以根据需要对其进行修改。我建议,它也有很好的api和xpath支持


重新定义“索引”要求,在遍历/查询文档的过程中,您可以在列表中缓存或映射任何元素或节点,以便稍后修改其文本。

听起来Jericho几乎就是您想要的。它是一个健壮的HTML解析器,专门设计用于对源文档进行非侵入性修改

虽然它没有DOM、SAX或StAX接口,但它有定制的API,这些API与这些标准非常相似,您应该能够相当轻松地将您的方法适应它们,或者在您正在使用的任何东西和Jericho之间编写适配器。例如,您可以使用Jaxen对Jericho文档执行XPath查询——请参见示例

Jericho对每个元素都有和end属性,甚至对于元素的某些部分,如标记名或属性名,因此您可以使用这些信息自己编辑文档,但Jericho真正的亮点是OutputDocument类,它允许您通过使用与查询匹配的Jericho元素调用适当的方法来直接指定替换,而不必显式地对它们调用getBegin()和getEnd(),并将其传递给某个替换方法。

这非常有效

范例

Tidy tidy = new Tidy(); // obtain a new Tidy instance
tidy.setXHTML(boolean xhtml); // set desired config options using tidy setters 
...                           // (equivalent to command line options)

tidy.parse(inputStream, System.out);
对于抓取DOM,我建议使用JDOM,它比简单的XML更快

就实现而言,我将创建一个新文档,并从源代码向其中添加节点。

我们使用它进行解析和实际清理

我们修复了服务器应用程序(内存管理、日志记录)中jericho的行为问题。(最初的开发人员认为我们的问题不够重要,不能放到主代码分支中)。 我们还制作了。

您可以试着使用

您可以采取(至少)两种方法—尝试将其用作实际的HTML解析器,然后将索引放入您感兴趣的原始字符串中


或者,它还内置了对源文本进行就地转换的支持,您可以将要对文本执行的转换定义为语法的一部分。

使用DOM然后将其转换为字符串表示不是更好吗?您将有一个更干净的HTML版本以及您的更改。您需要修改原始源字符串的具体原因是什么?我可以想出一个。如果您不必费力地处理大量文本更改(这些更改只是由于解析器以稍微不同的方式呈现XML的结果),那么就可以更容易地找出所做的实质性修改。Vivin-我正在尝试从HTML页面“清理”某些敏感项,以便可以对原始HTML运行其他解析测试(敏感数据被999或xxx等覆盖)。此外,我希望能够在Java和Javascript中运行不同的测试,因此原始源代码是我的最佳起点,因为Java HTML解析器和每个浏览器的HTML解析器可能会导致不同的DOM(尽管它们可能不应该)。很抱歉投了反对票,但此答案与我的问题无关。我会检查此答案并让您知道。我也会检查此答案。谢谢。我会在尝试后回来回答每个问题。
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.newDocument();
Element root = doc.createElement("root");
Text text = doc.createText("This is the root");
root.appendChild(text);
doc.appendChild(root);