0 0

请帮忙解决Html字符串转换成xml的问题,谢谢20

我的任务是将很不规范的html标记转换为符合xml规范的字母小写的标记串,比如将:
<FONT face= "宋体" color = #6600ff size="5" >
转换为:<font face="宋体" color="#6600ff" size="5">
还比如将:
<A HREF='http://setlist.jhtml?method=list' TARGET=_blank>
转换为:<a href='http://setlist.jhtml?method=list' target="_blank">
【注意上述第一个例子中的空格、引号变化;以及第二个例子中的大小写变化、"?"、"="号】

在解决第一个例子时,我采用以下方法很好的解决了问题,正确而简单的对font属性的值添加了引号,
但是在第二个例子中,出现了正则表达式的特殊字符“?”,还有我用于分组判断的“=”号(method=list),
于是转换不能成功,不知道有没有更好的办法,想听以下大家的意见,谢谢!
下面是我的代码,请耐心的看完,谢谢!

/**
 * 将html中所有<...>里面的内容全部转换为小写<br>
 * @param htmlContent
 * @return
 */
public static String formatToLowerCase(String htmlContent)
{
	if (htmlContent != null)
	{
		if (htmlContent.indexOf("<") != -1)
		{
			// 获取<...>
			Pattern p = Pattern.compile("<[^<>]+>");
			Matcher m = p.matcher(htmlContent);
			HashMap tmpMap = new HashMap();
			while (m.find())
			{
				// 利用map主键不能重复的特性防止重复判断很长的文本内容
				tmpMap.put(m.group(), "");
			}
			if (!tmpMap.isEmpty())
			{
				Iterator keys = tmpMap.keySet().iterator();
				while (keys.hasNext())
				{
					String key = (String) keys.next();
					String newKey = key.toLowerCase();
					htmlContent = htmlContent.replaceAll(key, newKey); // 转换为小写
				}
			}
		}
	}
	else
	{
		htmlContent = "";
	}

	return htmlContent;
}

/**
 * 给Html的属性添加上引号<br>
 * @param newKey
 * @return
 */
public static String addQuotMarks(String newKey)
{
	// 以"="号分组
	String[] equalMarkArray = newKey.split("=");

	if (equalMarkArray != null && equalMarkArray.length > 1)
	{
		StringBuffer keyBuf = new StringBuffer();
		for (int i = 0; i < equalMarkArray.length; i++)
		{
			int nDot = -1;
			String wholeStrng = equalMarkArray[i].trim();
			if (i == 0)// 第一组
			{
				keyBuf.append(wholeStrng + "=");
			}
			if (i != 0 && i != (equalMarkArray.length - 1))// 不是第一组,也不是最后一组
			{
				nDot = wholeStrng.lastIndexOf(" ");
				wholeStrng = addQuotMarks(wholeStrng, nDot);// 调用静态方法
				keyBuf.append(wholeStrng + "=");
			}
			else if (i == (equalMarkArray.length - 1))// 最后一组
			{
				nDot = wholeStrng.lastIndexOf(">");
				wholeStrng = addQuotMarks(wholeStrng, nDot);// 调用静态方法
				keyBuf.append(wholeStrng);
			}
		}
		newKey = keyBuf.toString();
	}

	return newKey;
}

/**
 * 私有静态方法,被addQuotMarks(String)调用<br>
 * 判断如果html属性的值不被单引号也不被双引号包含,则添加上双引号
 * @param wholeStr
 * @param nDot
 * @return
 */
private static String addQuotMarks(String wholeStrng, int nDot)
{
	String prefixStr = wholeStrng.substring(0, nDot).trim();
	if (!prefixStr.substring(0, 1).equals("\"") && !prefixStr.substring(0, 1).equals("\'"))
	{
		prefixStr = "\"" + prefixStr + "\"";
	}
	return prefixStr + wholeStrng.substring(nDot);
}
OO 
2008年5月26日 14:54

1个答案 按时间排序 按投票排序

0 0

采纳的答案

哥们,问对地方了,这玩艺可不简单,从头编码,不是一两个类就能搞定的,哪一个xml的解析框架不是很多代码啊。

对于非标准的html解析,我认为jericho是非常好的,trust me。

download:
http://sourceforge.net/project/showfiles.php?group_id=101067
home:
http://jerichohtml.sourceforge.net/doc/index.html
给你个例子:

import au.id.jericho.lib.html.*;
import java.util.*;
import java.io.*;
import java.net.*;

public class FormatSource {
	public static void main(String[] args) throws Exception {
		String sourceUrlString="data/test.html";
		if (args.length==0)
		  System.err.println("Using default argument of \""+sourceUrlString+'"');
		else
			sourceUrlString=args[0];
		if (sourceUrlString.indexOf(':')==-1) sourceUrlString="file:"+sourceUrlString;
		PHPTagTypes.register();
		MasonTagTypes.register();
		Source source=new Source(new URL(sourceUrlString));

		source.getSourceFormatter().setIndentString("  ").setTidyTags(true).writeTo(new OutputStreamWriter(System.out));
	}
}

2008年5月28日 16:40

相关推荐

Global site tag (gtag.js) - Google Analytics