2012-01-13 56 views
0

我正在尝试使用XMLParse来对付无效的xhtml内容。在html代码中,标签没有正确终止。为了终止它们,我使用替换函数来查找无效代码,并用正确终止的代码替换它。在这样做时,我的应用程序出错,并告诉我该元标记无效:使用ColdFusion创建有效的XML XMLParse

解析XML文档时发生错误。

元素类型“元”必须由匹配的结束标记“”终止。

我试图验证码:

<html> 
<head> 
<title>Impart Client Interface</title> 
<link href="side_panel.css" rel="stylesheet" type="text/css"> 
<link href="default.css" rel="stylesheet" type="text/css"> 
<link href="tabs.css" rel="stylesheet" type="text/css"> 
<link href="data_tables.css" rel="stylesheet" type="text/css"> 
<link href="xp_button.css" rel="stylesheet" type="text/css"> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 

我在CF已经创建试图处理是这样的:

<cfset xml = objResponse.FileContent> 

<cfset page.content = '<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">'> 
<cfset page.updatedcontent = replace('#page.content#','8859-1','8859-1" />"','')> 
<Cfset page.link = 'type="text/css">'> 
<cfset page.updatedLink = replace('#page.link#', 'css">', 'css" />', 'all')> 



<cfset validXML = replace(#xml#, "#page.content#", "#page.updatedContent#", "")> 
<cfset validXML = replace(#xml#, "#page.link#", "#page.UpdatedLink#", "all")> 
<cfoutput>#validXML#</cfoutput>  

<cfset parsethis = xmlparse(validXML)> 

<cfdump var="#parsethis#"> 

我怎样才能解决这个问题?

+0

我希望你对这个(x)HTML的来源有一个稳固的控制 - 如果不是的话,这种方法肯定会成为头痛的源头。 – 2012-01-13 19:38:49

回答

2

看起来像你对我缺少子的一部分,你的更换电话:

<cfset page.updatedcontent = replace(page.content,'8859-1">','8859-1" />')> 

注意添加“>

所以,上面会满足您的特定技术问题我”但是,对HTML进行字符串操作以尝试将它合并到正确的XHTML中是非常棘手的(正如你所看到的那样),相反,考虑放弃XMLParse以支持实际的HTML解析器,比如JSOUP。下载jar并将它添加到你的CF classpath后,你可以这样做:

<cfset jsoup = CreateObject("java", "org.jsoup.Jsoup")> 
<cfsavecontent variable="html"> 
<html> 
<body> 
<hr> 
<pre id="blah">Foo<br>bar1</pre> 
<hr> 
<pre id="blah2">Foo<br>bar2</pre> 
</body> 
</html> 
</cfsavecontent> 

<cfdump var="#jsoup.parse(html).select('pre').first().html()#"> 

将输出:

Foo<br />bar1 

漂亮漂亮,不是吗?而且不需要通过XML获取确切的细节。

+0

因为我无法控制源代码,所以我选择使用jSoup。 – aparker81 2012-01-16 15:59:33