我正在尝试使用XmlDocument
加载带URL的xml字符串XmlDocument doc = new XmlDocument();
//This fails because url is not being escaped.
doc.LoadXml("<item><name>http://google.com/test=aa&test2=22</name></item>");
//This passes as the url is being escaped.
doc.LoadXml("<item><name>"+SecurityElement.Escape("http://google.com/test=aa&test2=22")+"</name></item>");
我想做一些类似的事情,但对于使用良好替换方法的多个网址。 (也许使用正则表达式)
示例字符串输入
<item>
<name>http://google.com/test=aa&test2=22</name>
<name2>http://yahoo.com/test=aa&test2=22</name2>
<name><![CDATA[http://google.com/test=aa&test2=22]]></name>
</item>
我的输入必须是一个字符串。
还有更好的方法来解决这个问题吗?
答案 0 :(得分:1)
我现在看到你的问题了。您的XML无效。除非在CDATA部分中,否则需要转义&符号。有关详情,请参阅此帖子:What characters do I need to escape in XML documents?
修复您的XML并且不会出现问题。您可以使用以下网站测试XML:http://www.xmlvalidation.com/
有效XML的示例:
<item>
<name>http://google.com/?test=aa&test2=22</name>
<name2>http://yahoo.com/?test=aa&test2=22</name2>
<name><![CDATA[http://google.com/?test=aa&test2=22]]></name>
</item>
以下是一个实际可行的示例(在visual studio中测试)。
using System;
using System.Xml;
public class Program
{
public static void Main()
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(@"<item>
<name>http://google.com/?test=aa&test2=22</name>
<name2>http://yahoo.com/?test=aa&test2=22</name2>
<name><![CDATA[http://google.com/?test=aa&test2=22]]></name>
</item>");
printNodes(doc);
}
private static void printNodes(XmlNode parent)
{
foreach (XmlNode node in parent.ChildNodes)
{
Console.WriteLine("[" + node.NodeType + "] " + node.Name + " = " + node.Value);
printNodes(node);
}
}
}
答案 1 :(得分:0)
我为此创建了自己的方法
public string EscapeUrls(string url)
{
Regex regx = new Regex(@"(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?", RegexOptions.IgnoreCase);
MatchCollection mactches = regx.Matches(url);
foreach (Match match in mactches)
{
url = url.Replace(match.Value, SecurityElement.Escape(match.Value));
}
return url;
}