Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.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解析成XML吗?_Java_Coldfusion_Web Scraping_Html Parsing - Fatal编程技术网

Java 为什么可以';我不能把我的HTML解析成XML吗?

Java 为什么可以';我不能把我的HTML解析成XML吗?,java,coldfusion,web-scraping,html-parsing,Java,Coldfusion,Web Scraping,Html Parsing,我正在尝试使用xml将一些粗略的HTML解析为有效的xml 我的测试代码(使用从Ben Nadel的博客复制和粘贴的htmlParse函数): 出什么事了?如何更正它?我没有使用TagSoup,但多年来我一直使用TagSoup,从各种来源(包括MS Word)获取用户提供的HTML,并对其进行清理,使其返回XHTML,效果非常好 您可以在同一文档上尝试jTidy,方法是将jtidyjar放到类路径上或使用JavaLoader加载它。因为您使用的是CF10,所以可以使用 然后,以下是如何在cfsc

我正在尝试使用xml将一些粗略的HTML解析为有效的xml

我的测试代码(使用从Ben Nadel的博客复制和粘贴的htmlParse函数):


出什么事了?如何更正它?

我没有使用TagSoup,但多年来我一直使用TagSoup,从各种来源(包括MS Word)获取用户提供的HTML,并对其进行清理,使其返回XHTML,效果非常好

您可以在同一文档上尝试jTidy,方法是将jtidyjar放到类路径上或使用JavaLoader加载它。因为您使用的是CF10,所以可以使用

然后,以下是如何在cfscript中调用jTidy:

jTidy = createObject("java", "org.w3c.tidy.Tidy");

jTidy.setQuiet(false);
jTidy.setIndentContent(true);
jTidy.setSmartIndent(true);
jTidy.setIndentAttributes(true);
jTidy.setWraplen(1024);
jTidy.setXHTML(true);
jTidy.setNumEntities(true);
jTidy.setConvertWindowsChars(true);             
jTidy.setFixBackslash(true);        // changes \ in urls to /
jTidy.setLogicalEmphasis(true);     // uses strong/em instead of b/i
jTidy.setDropEmptyParas(true);

// create the in and out streams for jTidy
readBuffer = CreateObject("java","java.lang.String").init(parseData).getBytes();
inP = createobject("java","java.io.ByteArrayInputStream").init(readBuffer);
outx = createObject("java", "java.io.ByteArrayOutputStream").init();

// do the parsing
jTidy.parse(inP,outx);
outstr = outx.toString();
这将返回可用XPath查询的有效XHTML。我将上述内容包装到makeValid()函数中,然后针对您的HTML运行它:

    <cfset html='<tr > <td align="center"> <span id="id1" >Compliance Review</span> </td><td class="center"> <span id="id2" >395.8(i)</span> </td><td align="left"> <span id="id3" >Failing to submit a record of duty status within 13 days </span> </td><td class="center" > <span id="id4">4/17/2014</span> </td> </tr>' />
<cfset out = makeValid(html) />
<cfdump var="#xmlParse(out)#" />

结果如下:


当您使用ColdFusion调用方法时,这里使用的是直接向上的Java。在我看来,输入的格式不好,或者解析器中有一个错误。@J.t.-这难道不是说它也应该适用于“脏”html,并且输入的格式不一定要好吗?@froadie不确定Tagsoup的问题,但我使用了Jsoup,它工作得很好。这两个链接可能很方便。和@GauravS-谢谢,我切换到了Jsoup,它工作得很好…实际上,根据@GauravS的评论,我最终使用了Jsoup。。。但是谢谢你,关于如何包含jar的链接也很有用。
jTidy = createObject("java", "org.w3c.tidy.Tidy");

jTidy.setQuiet(false);
jTidy.setIndentContent(true);
jTidy.setSmartIndent(true);
jTidy.setIndentAttributes(true);
jTidy.setWraplen(1024);
jTidy.setXHTML(true);
jTidy.setNumEntities(true);
jTidy.setConvertWindowsChars(true);             
jTidy.setFixBackslash(true);        // changes \ in urls to /
jTidy.setLogicalEmphasis(true);     // uses strong/em instead of b/i
jTidy.setDropEmptyParas(true);

// create the in and out streams for jTidy
readBuffer = CreateObject("java","java.lang.String").init(parseData).getBytes();
inP = createobject("java","java.io.ByteArrayInputStream").init(readBuffer);
outx = createObject("java", "java.io.ByteArrayOutputStream").init();

// do the parsing
jTidy.parse(inP,outx);
outstr = outx.toString();
    <cfset html='<tr > <td align="center"> <span id="id1" >Compliance Review</span> </td><td class="center"> <span id="id2" >395.8(i)</span> </td><td align="left"> <span id="id3" >Failing to submit a record of duty status within 13 days </span> </td><td class="center" > <span id="id4">4/17/2014</span> </td> </tr>' />
<cfset out = makeValid(html) />
<cfdump var="#xmlParse(out)#" />